Удалить несколько строк на основе выбора - PullRequest
3 голосов
/ 30 марта 2012

Я пытаюсь создать триггер, который удалит строки из одной таблицы на основе выбора в другой таблице

таблица operatorpositions столбцы operator, line, pos

таблица positiontags столбцы line, position, tag

таблица operatortags столбцы operator, tag

Мой триггер выглядит следующим образом

CREATE TRIGGER removeOperatorPosition AFTER DELETE ON operatorpositions
    FOR EACH ROW
    BEGIN
        DELETE FROM operatortags WHERE gen = NEW.operator 
            AND tag = (SELECT tag FROM positiontags WHERE position = NEW.pos AND line = NEW.line);            
    END;

Проблема в том, что для одной позиции может быть несколько тегов, поэтому подзапрос вернет несколько строк.Как мне нужно изменить это, чтобы он работал с несколькими тегами?

Ответы [ 3 ]

3 голосов
/ 30 марта 2012
CREATE TRIGGER removeoperatorposition AFTER DELETE
ON operatorpositions
FOR EACH ROW
BEGIN
  DELETE FROM operatortags
  WHERE  gen = new.operator
         AND tag IN (SELECT tag
                     FROM   positiontags
                     WHERE  position = new.pos
                            AND line = new.line);
END; 

При изменении с = на IN оператор должен работать с подзапросами, возвращающими несколько строк

3 голосов
/ 30 марта 2012

Более эффективный способ сделать это - использовать соединение -

CREATE TRIGGER removeOperatorPosition AFTER DELETE ON operatorpositions
    FOR EACH ROW
    BEGIN
        DELETE ot
        FROM operatortags ot
        INNER JOIN positiontags pt
            ON ot.tag = pt.tag
        WHERE ot.gen = OLD.operator 
        AND pt.position = OLD.pos
        AND pt.line = OLD.line;            
    END;
3 голосов
/ 30 марта 2012

Если я вас понял, вы хотите удалить все теги.
, поэтому попробуйте заменить ваш = перед подзапросом на IN

CREATE TRIGGER removeOperatorPosition AFTER DELETE ON operatorpositions
    FOR EACH ROW
    BEGIN
        DELETE FROM operatortags WHERE gen = NEW.operator 
            AND tag IN (SELECT tag FROM positiontags WHERE position = NEW.pos AND line = NEW.line);            
    END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...