Триггер вставьте другой ряд

Триггер sqlite3, который я хочу создать, может или не может быть возможным с sql. Пять таблиц участвуют:

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?

1 ответ

Как документально подтверждено, не существует такой вещи, как FOR EACH ROW IN ... пункт.

Тем не менее INSERT Заявление может использовать SELECT заявление как источник данных для вставки. Напиши SELECT оператор, который возвращает одну строку для каждого члена группы:

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 фильтр.)

Другие вопросы по тегам