SQL:删除父项不存在的数据

时间:2009-11-05 14:03:58

标签: sql

我有一个分层表'pages',带有'id'和'id_parent'字段。感谢一些糟糕的旧代码,仍然有很多行没有父代。我想删除这些行。这只能使用SQL吗?

7 个答案:

答案 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_parentNULL的行。

答案 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

我在评论中添加了选择部分,因为您可以先运行它以查看您将删除的确切记录。