【问题标题】:Delete Parent record if child is not present如果孩子不存在,则删除父记录
【发布时间】:2014-02-13 00:28:03
【问题描述】:

我正在表变量中创建菜单和子菜单。 (典型的同表父子记录) 所有顶级菜单的 ParentID coll 为空。对于他们的孩子 ParentID 将是这些父菜单的 MenuId。 (取决于构建的用户日志类型) 现在我要做的是,如果特定的父级没有任何子级,我想从这个表变量中删除这个父级记录。
我知道我可以用光标或逐行操作来处理它。我可以用其他方法吗?

【问题讨论】:

  • 您希望将其作为维护工作(即一次),还是作为定期发生的,每当孩子被删除时?

标签: sql sql-server


【解决方案1】:

像这样的单个语句应该做到这一点(作为使用存在的替代):

delete p
from
    tblMenu p
    left join tblMenu c on p.ID = c.ParentID
where 
    p.ParentID is null --Ensures that the item to delete is at the top
    and c.ParentID is null --Finds top level items with no children

【讨论】:

    【解决方案2】:

    如果没有看到您的表结构,很难告诉您您需要的确切查询,但是,如果我正确理解您的问题,您只需要执行以下操作:

    DELETE T 
    FROM MyTable T 
    WHERE NOT EXISTS(SELECT * FROM MyTable WHERE ParentID = T.MenuID)
        AND T.ParentID IS NULL
    

    此查询执行相关子查询以查找所有没有子记录的菜单记录。它使用 SQL 的EXISTS 子句

    【讨论】:

      【解决方案3】:

      你可以这样做:

      delete from yourtable yt where not exists (select * from yourtable yt2 where yt.id = yt2.parentid) and yt.parentid is null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        相关资源
        最近更新 更多