0

1 つのテーブル (A) への行の挿入に応答して、3 番目のテーブル (C) (最初のテーブルに結合可能) の値に基づいて、2 番目のテーブル (B) で複数の行を作成または更新しようとしています。 .

私は次の構造を持っています、

CREATE TRIGGER MyTrigger AFTER INSERT ON A
    BEGIN
        INSERT OR REPLACE INTO B (ID, T1, T2, Role)
        VALUES
        (
            ( SELECT ID FROM C WHERE R1 = NEW.R1 ),
            NEW.T1,
            B.T2, -- The existing row's T2
            ( SELECT Role FROM C WHERE R1 = NEW.R1 ),
        )
    END;

Table A has columns ID, T1, R1
Table B has columns ID, T1, T2, Role
Table C has columns ID, R1, R2, Role

トリガーを作成しようとして、少なくとも 2 つの問題があります。

  1. REPLACE ケースで B の既存の値を参照する方法がわからないため、「B.T2」
  2. テーブル B で INSERT/REPLACE を実行するときに、テーブル C の同じ行から複数​​の列 (R1、Role) を参照する方法がわかりません。

これを整理するのに助けてくれてありがとう。

4

3 に答える 3

1

SELECTの代わりに使用VALUES:

CREATE TRIGGER MyTrigger AFTER INSERT ON A BEGIN
    INSERT OR REPLACE INTO B (ID, T1, T2, Role) SELECT
        (SELECT ID FROM C WHERE R1 = NEW.R1),
        NEW.T1,
        B.T2,
        (SELECT Role FROM C WHERE R1 = NEW.R1)
        FROM B WHERE ROWID=NEW.ROWID
    END;
于 2013-10-29T17:55:24.127 に答える
1

既存の行があるかどうかに関係なく、必要なすべての値に名前を付けることができるように、SELECT で LEFT OUTER JOIN を使用できました。

CREATE TRIGGER MyTrigger AFTER INSERT ON A
    BEGIN
        INSERT OR REPLACE INTO B (ID, T1, T2, Role)
            SELECT
                C.ID,
                NEW.T1,
                B.T2,
                C.Role
            FROM C LEFT OUTER JOIN B ON C.ID = B.ID WHERE C.R1 = NEW.R1;
    END;
于 2013-10-30T12:29:12.137 に答える
0

レコードを見つけるには、Bで行っているようにサブクエリを使用してくださいC。検索するB.ID値は、挿入しようとしている値と同じです。

CREATE TRIGGER MyTrigger
AFTER INSERT ON A
BEGIN
    INSERT OR REPLACE INTO B (ID, T1, T2, Role)
    VALUES
    (
        ( SELECT ID FROM C WHERE R1 = NEW.R1 ),
        NEW.T1,
        ( SELECT T2 FROM B WHERE ID = ( SELECT ID FROM C WHERE R1 = NEW.R1 ) ),
        ( SELECT Role FROM C WHERE R1 = NEW.R1 )
    );
END;
于 2013-10-29T20:06:40.193 に答える