这是我的查询,理论上这将是我想要的,但我知道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可能有更优雅的解决方案。
额外信息: 查询的作用是从清单中删除托盘,这些托盘是空的。用户创建托盘然后在其上放置盒子,如果他们创建托盘但不在其上放置任何盒子,则在清单关闭时需要移除托盘。
答案 0 :(得分:4)
DELETE manifestPallet
FROM manifestPallet LEFT JOIN manifestBox USING (palletID)
WHERE manifestBox.palletID IS NULL
答案 1 :(得分:0)
您只需指定要应用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` ....
答案 2 :(得分:0)
DELETE FROM manifestPallet mp
WHERE NOT EXISTS (
SELECT *
FROM manifestBox mbx
WHERE mp.palletID = mbx.palletID
);
注意:原始查询存在语义差异,因为IN( subselect)
术语会删除NULL(和重复项)。
这可能不会导致实际结果的不同,因为palletID可能是一个NOT NULLable(主)键。