gpt4 book ai didi

MySQL DELETE FROM with UNION 子查询按 IN 条件

转载 作者:行者123 更新时间:2023-11-29 01:30:07 25 4
gpt4 key购买 nike

我遇到了一个奇怪的 SQL 错误。最后一个查询不起作用。当然,我可以将 DELETE 拆分为三个查询,但我真的很奇怪为什么 MySQL 不允许我这样做。

一个小例子:

(SELECT id FROM stairs WHERE building = 123)
UNION
(SELECT id FROM lift WHERE building = 123)
UNION
(SELECT id FROM qrcodeid WHERE building = 123)

有效!

DELETE FROM startpoint WHERE id IN (SELECT id FROM stairs WHERE building = 123)

同样有效!

鉴于

DELETE FROM startpoint WHERE id IN (
(SELECT id FROM stairs WHERE building = 123)
UNION
(SELECT id FROM lift WHERE building = 123)
UNION
(SELECT id FROM qrcodeid WHERE building = 123)
)

引发错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION (SELECT id FROM lift WHERE building = 123) UNION (SELECT id FROM qrc' at line 3

有人知道吗?

最佳答案

试试这个版本:

DELETE FROM startpoint
WHERE id IN (select *
from ((SELECT id FROM stairs WHERE building = 123)
UNION
(SELECT id FROM lift WHERE building = 123)
UNION
(SELECT id FROM qrcodeid WHERE building = 123)
)

我认为这个问题是关于子查询定义的神秘问题。子查询是 select 语句,而 unionselect 语句的结合。

编辑:

实际上,如果你想要效率,你根本不会使用这种方法。我只是想展示如何修复错误。更好的解决方案是:

DELETE sp FROM startpoint sp
WHERE EXISTS (select 1 from stairs s where s.building = 123 and s.id = sp.id) or
EXISTS (select 1 from lift l where l.building = 123 and l.id = sp.id) or
EXISTS (select 1 from qrcodeid q where q.building = 123 and q.id = sp.id);

建议在 stairs(id, building)lift(id, building)qrcodeid(id, building) 上使用索引。

关于MySQL DELETE FROM with UNION 子查询按 IN 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com