【问题标题】:T-SQL How to delete all child items while deleting parentT-SQL如何在删除父项时删除所有子项
【发布时间】:2017-09-04 23:57:11
【问题描述】:

所以我现在处境艰难(至少对我而言)。我是一名新程序员,我在一家公司担任初级程序员。我有一项任务,我必须执行以下操作:

删除父项时,必须删除所有关联的子任务。例如:在上表中,如果用户删除“父母 1”,则应删除所有子/孙/曾孙以及与该孩子关联的所有其他人。

所以在这种情况下,如果用户删除了“父 1”。 - Parent 1 应与 Child 1、Child 2、Child 3、GrandChild 1、GrandChild 2、GrandChild 3、GrandChild 4 一起删除。

如果用户删除 Child 2, - 孙子 5 应该被自动删除。

我不确定如何编写可以执行此操作的 SQL 脚本?

有什么建议吗?我在 MS SQL Server 上运行此查询

【问题讨论】:

  • 对于 Oracle,请参阅 this 页面。
  • 只需向同事寻求帮助和一些辅导。
  • 我很困惑——你的标题是 T-SQL——通常是 MSSQL,你的标签是 Oracle——还是只有我?
  • 如果这始终是业务规则,则可能应该定义“on delete cascade”外键。然后你只需删除父级。

标签: php sql sql-server


【解决方案1】:

首先,您需要一个 hierarchical query 来检索给定“父 1”的所有子行 - 这是 Oracle 数据库的版本:。

SELECT * 
FROM table
START WITH name = 'Parent 1'
CONNECT WITH PRIOR item_no = parent_item_no

现在任务变得简单了:

DELETE FROM table
WHERE ItemNo IN (
    SELECT ItemNo 
    FROM table
    START WITH name = 'Parent 1'
    CONNECT WITH PRIOR item_no = parent_item_no
)

SQL-Server 版本:
这是一个 reqursive 查询,它给出了 Parent 1 -> Demo 的所有后代

WITH q AS(
  SELECT item_no, parent_item_no, name
  FROM t
  WHERE name = 'Parent 1'
  UNION ALL
  SELECT t.item_no, t.parent_item_no, t.name
  FROM t
  JOIN q
  ON t.parent_item_no = q.item_no
)
SELECT * FROM q;

这个DELETE语句使用上面的查询删除Parent 1下面的整个子树

WITH q AS(
  SELECT item_no, parent_item_no, name
  FROM t
  WHERE name = 'Parent 1'
  UNION ALL
  SELECT t.item_no, t.parent_item_no, t.name
  FROM t
  JOIN q
  ON t.parent_item_no = q.item_no
)
DELETE FROM t WHERE item_no IN (
       SELECT item_no FROM q
);

演示:http://sqlfiddle.com/#!6/9a171/1

【讨论】:

  • 谢谢,我会试试看它是否有效!感谢您的帮助。
  • Msg 336,级别 15,状态 1,第 24 行“名称”附近的语法不正确。如果这是一个公用表表达式,则需要用分号显式终止前面的语句。消息 319,级别 15,状态 1,第 25 行关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
  • 嗯,这是对Oracle database 的查询,因为您用Oracle 标记了您的问题。但是你的问题的标题是T-SQL 这是MS-SQL。 (或 SQL 服务器)。我猜你正试图在 SQL-Server 上运行它。此查询不在 SQL-Server 上运行。
  • 是的,对不起,我应该更具体。此查询适用于 MS SQL Server
  • 为了将来参考,使用正确的标签对你非常有帮助,因为这意味着了解 SQL Server 的人会阅读它们。它还可以防止其他人浪费时间回答错误的问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多