繁体   English   中英

重新编写查询以从选择语句中删除

[英]Re-writing my query to delete from a select statement

这是我的查询,理论上是我想要的,但是我知道MySQL不允许您在子选择中使用与删除相同的表:

DELETE FROM manifestPallet WHERE palletID IN 
( SELECT  manifestPallet.palletID 
            FROM manifestPallet
            LEFT JOIN manifestBox
            ON manifestPallet.palletID = manifestBox.palletID
            WHERE manifestBox.palletID IS NULL)

我知道我可以先进行选择,然后遍历我的php脚本中的结果并删除查询,但是我认为使用纯MySQL可能是更优雅的解决方案。

额外信息:查询的作用是从清单中删除空的托盘。 用户创建货盘,然后在其上放置盒子,如果他们创建货盘,但未在其上放置任何盒子,则在清单关闭时需要将货盘取下。

DELETE manifestPallet
FROM   manifestPallet LEFT JOIN manifestBox USING (palletID)
WHERE  manifestBox.palletID IS NULL

您只需要指定在哪些表上应用DELETE。

仅删除manifestPallet行:

DELETE `manifestPallet` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

删除manifestPallet和manifestBox行:

DELETE `manifestPallet`, `manifestBox` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

仅删除manifestBox行:

DELETE `manifestBox` FROM `manifestPallet` LEFT JOIN `manifestBox` ....
DELETE FROM manifestPallet mp
WHERE NOT EXISTS (
    SELECT *
    FROM manifestBox mbx
    WHERE mp.palletID = mbx.palletID
    );

注意:与原始查询在语义上有所不同,因为IN( subselect)词删除了NULL(和重复项)。 这可能不会在实际结果中引起差异,因为palletID可能是一个不可为空的(主)键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM