[英]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.