【问题标题】:Insert into from select with multiple columns and multiple tables从多列和多表中插入
【发布时间】:2017-06-21 20:54:15
【问题描述】:

我需要创建一个 SQL 触发器,其中插入语句从不同的表中选择多个列。像这样的:

CREATE OR REPLACE TRIGGER ACTIV_TRG 
AFTER INSERT ON TRANS_LOG
REFERENCING NEW AS TR  
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
    INSERT INTO ACTIVITIES values ( 
    (SELECT MAX(SEQNBR) FROM ACTIV_LOG where TRAN_ID = 'XXX'),
    TR.ACCOUNT,
    TR.EVENT, 
    SELECT TRAN_ID ,
    TRAN_DT ,
    TRAN_LN  FROM ACTIV_DEL where TRAN_ID = 'XXX',
    CURRENT TIMESTAMP
)
END;

问题是当我尝试在子查询中选择多个列时。 我知道我是否像这样分隔子查询:

(TRAN_ID  FROM ACTIV_DEL where TRAN_ID = 'XXX'),
(TRAN_DT  FROM ACTIV_DEL where TRAN_ID = 'XXX'),
(TRAN_LN  FROM ACTIV_DEL where TRAN_ID = 'XXX'),

会起作用,但肯定有更好、更有效的方法来做到这一点。

提前致谢。

肯定有比这更好的解决方案:

CREATE OR REPLACE TRIGGER ACTIV_TRG 
AFTER INSERT ON TRANS_LOG
REFERENCING NEW AS TR  
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
   INSERT INTO ACTIVITIES values ( 
   (SELECT MAX(SEQNBR) FROM ACTIV_LOG where TRAN_ID = 'XXX'),
   TR.ACCOUNT, ---> FIELD FROM TRANS_LOG (TRIGGER SOURCE)
   TR.EVENT,   ---> FIELD FROM TRANS_LOG (TRIGGER SOURCE)
   SELECT TRAN_ID  FROM ACTIV_DEL where TRAN_ID = 'XXX',  ---> REPETING SELECT
   SELETC TRAN_DT  FROM ACTIV_DEL where TRAN_ID = 'XXX',  ---> REPETING SELECT
   SELECT TRAN_LN  FROM ACTIV_DEL where TRAN_ID = 'XXX',  ---> REPETING SELECT
   CURRENT TIMESTAMP
)
END;

【问题讨论】:

    标签: sql triggers db2


    【解决方案1】:

    我会使用以下选择进行插入:

        SELECT (SELECT MAX(SEQNBR) FROM ACTIV_LOG where TRAN_ID = 'XXX'),
            TR.ACCOUNT,
            TR.EVENT,
            TRAN_ID ,
            TRAN_DT ,
            TRAN_LN,
            CURRENT TIMESTAMP
            FROM ACTIV_DEL
            where TRAN_ID = 'XXX'
    

    【讨论】:

    • 谢谢 Mary,但问题是我还需要来自另一个子查询的 3 列:SELECT TRAN_ID、TRAN_DT、TRAN_LN FROM ACTIV_DEL where TRAN_ID = 'XXX', CURRENT TIMESTAMP
    • @Bill_Buckner 我认为这完全涵盖了您的问题,因为它正在对表 ACTIV_DEL 进行选择
    • Mary- 但问题是我不能以这种方式使用插入,因为表 ACTIV_DEL 可能没有记录,我仍然需要插入受影响的表(TRANS_LOG)的值触发器。
    • @Bill_Buckner 我会检查该值是否存在于 ACTIV_DEL 如果它不存在我会在这些字段中插入一个空值而不是进行选择(检查是否存在link
    • 这是一个很好的方法,但是我们在 DB2 中运行并且不支持条件 INSERT。
    【解决方案2】:

    这样的?

    CREATE OR REPLACE TRIGGER ACTIV_TRG 
    AFTER INSERT ON TRANS_LOG
    REFERENCING NEW AS TR  
    FOR EACH ROW MODE DB2SQL
    BEGIN ATOMIC
        INSERT INTO ACTIVITIES 
            SELECT (SELECT MAX(f0.SEQNBR) FROM ACTIV_LOG f0 where f0.TRAN_ID = f1.TRAN_ID),
            TR.ACCOUNT,
            TR.EVENT,
            f1.TRAN_ID ,
            f1.TRAN_DT ,
            f1.TRAN_LN,
            CURRENT TIMESTAMP
            FROM ACTIV_DEL f1
            where f1.TRAN_ID = 'XXX'
    
    END;
    

    【讨论】:

    • 问题是表 ACTIV_DEL 可能没有记录,我需要在触发器中插入受影响的表(TRANS_LOG)的值,无论是否无法从 ACTIV_DEL 表中获取 TRAN_ID、TRAN_LN 和 TRAN_ID .
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2019-07-11
    • 2014-06-09
    相关资源
    最近更新 更多