2017-09-03 56 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

當我嘗試查詢您發佈的查詢時遇到此錯誤 –