0

私が作成したい sqlite3 トリガーは、SQL では可能である場合と不可能である場合があります。5 つのテーブルが含まれます。

Members               Groups                  GroupMembers      Accounts       
mId |name| accId      gId | name | accId      gId | mId         accId | balance

Orders
oId | accId | ammount

誰かがグループを削除したときに、グループのメンバーごとにグループ残高の平均で注文したいです。したがって、次のようにする必要があります。

CREATE NEW TRIGGER triggername 
BEFORE DELETE ON Groups
WHEN ((SELECT balance FROM Accounts WHERE accId=OLD.accId) = 0)
FOR EACH ROW IN 
(SELECT accId 
FROM GroupMembers JOIN Members ON GroupMembers.mId = Members.mId 
WHERE GroupMembers.gId = OLD.gId)
BEGIN
INSERT INTO Orders(accId,ammount) VALUES(accId, 
(SELECT balance FROM Accounts WHERE accId = OLD.accId)
 / 
(SELECT SUM(mId) FROM GroupMembers WHERE gId = OLD.gId)
);
END

問題は、トリガーが適用されるテーブル以外のテーブルに FOR EACH ROW を作成することは可能かということです。FOR EACH ステートメントの前に WHEN ステートメントを置くことは可能ですか?

4

1 に答える 1

0

文書化されているように、FOR EACH ROW IN ...条項のようなものはありません。

ただし、INSERTステートメントは、挿入されるデータのソースとしてステートメントを使用できますSELECTSELECTグループ メンバーごとに 1 行を返すステートメントを作成します。

CREATE TRIGGER triggername
AFTER DELETE ON Groups
FOR EACH ROW
BEGIN
    INSERT INTO Orders(accId, amount)
    SELECT accId,
           (SELECT balance
            FROM Accounts
            WHERE accId = OLD.accId) /
           (SELECT COUNT(*)
            FROM GroupMembers
            WHERE gId = OLD.gId)
    FROM Members
    WHERE mId IN (SELECT mId
                  FROM GroupMembers
                  WHERE gId = OLD.gId);
END;

balance = 0(フィルターを落としました。)

于 2013-05-25T20:09:27.557 に答える