2012-03-30 89 views
3

我试图做一个触发器,它会从一个基于表中选择删除另一个表中的行删除基于多行选择

operatorpositionsoperatorlinepos

positiontags 色谱柱line,position,tag

operatortags co lumns operatortag

我的触发看起来像这样

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

如果我明白你想删除所有标签。
所以尽量用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; 
+0

工作,只是不得不将'新'改为'旧' – 2012-03-30 12:05:11

3
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运营商子查询之前更换你=应于子返回多行

+0

是的,感觉愚蠢是如此容易:)还必须更改'新'为'旧',因为即时删除 – 2012-03-30 11:48:42

3

更有效的方式来做到这一点是利用工作一个加入 -

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; 
+0

也可以,谢谢 – 2012-03-30 12:04:33