我有一个分层表'pages',带有'id'和'id_parent'字段。感谢一些糟糕的旧代码,仍然有很多行没有父代。我想删除这些行。这只能使用SQL吗?
答案 0 :(得分:5)
是肯定的。这很简单,没有优化,(假设父母不再存在),但它会给你一个开始的地方
DELETE FROM Pages WHERE Id_Parent NOT IN (SELECT ID FROM PagesParent);
根据评论,这似乎是一个自引用表。基本上,Pages的ID_Parent链接到Pages的ID。
因此你需要折磨一下TSQL。 注意:我使用SQL SERVER并且不确定这是否是标准SQL并且可以在其他RDBMS中使用。也就是说,沿着这些方向的东西应该得到你所追求的东西。
WITH t(ID, ID_Parent) AS
(
SELECT ID,ID_Parent from Pages where id = @ID
UNION ALL
SELECT st.ID, st.ID_Parent FROM Pages st
INNER JOIN t ON st.ID_Parent = t.id
)
DELETE PAGES
FROM Pages s
LEFT JOIN t ON s.ID = t.ID
WHERE t.ID IS NULL
答案 1 :(得分:1)
SELECT id
--DELETE
FROM myTable
WHERE id_parent IS NULL
或
SELECT id
--DELETE
FROM myTable
WHERE id_parent IS NOT IN (SELECT id FROM myTable)
答案 2 :(得分:1)
您也可以这样做:
delete P
from Pages P
left join PagesParent Parent
on Parent.Id_Parent=P.Id_Parent
where Parent.Id_Parent is null -- This tells you that the row doesn't exists in the table PagesParent
答案 3 :(得分:0)
你可以这样做:
DELETE FROM pages WHERE id_parent NOT IN (SELECT id FROM pages)
假设您的父行具有null id_parent,您需要添加:
AND NOT id_parent IS NULL
答案 4 :(得分:0)
DELETE
FROM pages pc
WHERE NOT EXISTS
(
SELECT NULL
FROM pages pp
WHERE pp.id = pc.id_parent
)
与IN
解决方案不同,适用于id_parent
为NULL
的行。
答案 5 :(得分:0)
就像你用英语说的那样
Delete Pages Where parent does not exist,
或在SQL中:
Delete Pages
Where Not Exists
(Select * From pages
Where Id = p.id_Parent)
答案 6 :(得分:0)
您可以在SQL Server中使用左连接。不知道它是否适用于所有数据库)
delete p
--select *
from pages p
left join Parent pt on p.id = pt.id
where pt.id is null
我在评论中添加了选择部分,因为您可以先运行它以查看您将删除的确切记录。