2013-05-25 20 views
0

,我想創造可能或不可能與SQL中的sqlite3的觸發。 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?是否有可能將WHEN陳述放在FOR EACH陳述之前?

+0

什麼是你的問題? –

+0

#COUNT(mId)not SUM(mId) – user1111652

回答

0

由於documented,有沒有這樣的事,作爲一個FOR EACH ROW IN ...條款。

然而,INSERT聲明can use a SELECT statement as the source of the data to be inserted。 寫SELECT語句返回一行爲每個組成員:(我放棄了balance = 0過濾器)

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;