T-SQL删除父项时如何删除所有子项

时间:2017-09-03 05:09:54

标签: php sql sql-server

所以我现在处于困境(至少对我而言)。我是一名新的程序员,我在一家公司担任初级程序员。我有一项任务,我必须做以下事情:

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

enter image description here

因此,在这种情况下,如果用户删除“父1”。 - 父母1应与孩子1,孩子2,孩子3,GrandChild 1,GrandChild 2,GrandChild 3,GrandChild 4一起删除。

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

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

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

1 个答案:

答案 0 :(得分:0)

首先,您需要一个hierarchical query来检索给定"父1和#34;的所有子行。 - 这是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