2016-03-01 90 views
0

UNION是否不应该用于更新子查询的WHERE子句中?或者就此而言,即使正常的选择子查询?更新子查询的WHERE子句中的UNION

有没有更好的方法来消除UNION这样的查询?

请注意,对于我的情况,UNION将导致相当少量的记录。

UPDATE mytable 
set mytable.bla='xxx' 
WHERE id IN (
    SELECT id 
    FROM t1 
    INNER JOIN t2 ON t2.t1_id=t1.id 
    LEFT OUTER JOIN t3 ON t3.t1_id=t2.id 
    WHERE t2.id IN (1,2,3) AND t3.id IS NULL 
    UNION 
    SELECT id FROM t4 
    INNER JOIN t5 ON t5.id=t4.t5_id 
    LEFT OUTER JOIN t6 ON t6.t5_id=t5.id 
    WHERE t5.parent_id IN (1,2,3) AND t6.id IS NULL 
); 
+0

UNION ALL吧? – jarlh

+1

一个问题是,当使用等号时子查询只能返回一个值 - 也许你的意思是“in”。如果这个查询导致多个记录,它会错误...顺便说一句 - 我不相信查询是相关的,因为它没有引用'mytable'。 – sgeddes

+0

@sgeddes是的,在看到您的评论后,我同意这可能与您提供的理由无关。但是,问题仍然是我应该或不应该在WHERE子句中进行查询。我认为当有人这样做时,我不应该使用'IN',而是使用'='。也许不会? – user1032531

回答

1

它切换到加盟: -

UPDATE mytable 
INNER JOIN 
(
    SELECT id 
    FROM t1 
    INNER JOIN t2 ON t2.t1_id=t1.id 
    LEFT OUTER JOIN t3 ON t3.t1_id=t2.id 
    WHERE t2.id IN (1,2,3) 
    AND t3.id IS NULL 
    UNION 
    SELECT id 
    FROM t4 
    INNER JOIN t5 ON t5.id=t4.t5_id 
    LEFT OUTER JOIN t6 ON t6.t5_id=t5.id 
    WHERE t5.parent_id IN (1,2,3) 
    AND t6.id IS NULL 
) sub0 
ON mytable.id = sub0.id 
SET mytable.bla='xxx' 
+0

好的,我可以这样做。但为什么它更好?谢谢 – user1032531

+0

根据MySQL的版本,IN(子查询)非常慢。由于您的子查询可能会返回多行,因此您不能只使用=来检查值。 – Kickstart

+0

听起来对我很好。会给它多一点时间,并选择这个作为最佳答案。谢谢您的帮助。 – user1032531