2017-09-03 135 views
0

所以我现在处于困难的境地(对我来说至少)。我是一名新程序员,我在一家公司担任初级程序员。我有一个任务,我必须执行以下操作:T-SQL如何在删除父项时删除所有子项目

当您删除父项时,必须删除与所有关联的子任务。例如:在上面的这个表格中,如果用户删除'Parent 1',则应该删除所有的子/孙/伟大的孩子以及与该孩子相关的其他人。

enter image description here

因此,在这种情况下,如果用户删除 '父1'。 - 孙子5应该被自动删除 - 父母1应与少年1,少年2,儿​​童3,孙子女1,孙子女2,孙子女3,孙子女4.

如果用户删除少年2, 一起被删除。

我不知道如何编写一个SQL脚本来做到这一点?

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

+0

的[PHP MySQL的删除父和子行]可能的复制(https://stackoverflow.com/questions/15747353/php-mysql-delete-parent-and-child-rows) –

+0

对于Oracle请参阅[this](https://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php)页面。 –

+0

只需向同事寻求帮助和辅导。 – Maritim

回答

0

首先,您需要一个hierarchical query,用于检索给定“Parent 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服务器:
这是一个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

+0

谢谢,我会试试看看它是否有效!感谢帮助。 –

+0

消息336,级别15,状态1,行24 “名称”附近的语法不正确。如果这是一个通用表格表达式,则需要用分号明确地终止前面的语句。 消息319,级别15,状态1,行25 关键字'with'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或变更跟踪上下文子句,则前面的语句必须以分号结尾。 –

+0

当我尝试查询您发布的查询时遇到此错误 –