2016-09-15 25 views
0

我有一個父和PARENT_ID加入了一個子表,我想在子表中使用的值刪除兩個表中的行刪除外鍵加入2個表中的行DB2對我使用SQL子價值

這就是我想和它不工作

WITH 
-- DELETE THE COSTS FIRST AND LET DB2 STORE THE IDs IN AN 'OLD TABLE' 
DELETED_CHILD(ID) AS (SELECT PAYABLE_ID FROM OLD TABLE (
DELETE FROM MYLIB.MYCOST 
WHERE KEY_VALUE = '1000000' 
) 
), 
-- DELETE THE PAYABLE HEADER USING THE DELETED_LINK IDs 
DELETED_PARENT(ID) AS (SELECT PAYABLE_ID FROM OLD TABLE (
DELETE FROM MYLIB.MYPAYABLE 
WHERE PAYABLE_ID IN (SELECT DISTINCT ID FROM DELETED_CHILD) 
) 
) 
(
-- SELECT IN WITH STATEMENT IS MANDATORY USELESS STATEMENT 
SELECT * FROM SYSIBM.SYSDUMMY1 
); 

我得到的錯誤是

錯誤代碼-199,SQL狀態42601:預計不會[SQL0199]關鍵詞表。有效令牌:)取貨訂單UNION除外。

我想刪除所有的孩子,然後他們的父母。 任何幫助表示讚賞

+0

哪個版本?舊版本可能不支持_Data更改表_。 – mustaccio

+0

從版本6.1開始,DB2 for i中允許使用_data-change-table-reference_,但只有INSERT語句可用於IBM i 7.3。 – user2338816

+0

我在舊7.1上運行,解決方案是什麼? – user1500144

回答

0

成才這樣

DECLARE GLOBAL TEMPORARY TABLE DELETED_CHILD AS ( 
SELECT * FROM MYLIB.MYCOST 
WHERE KEY_VALUE = '1000000' 
) WITH DATA WITH REPLACE NOT LOGGED; 

DECLARE GLOBAL TEMPORARY TABLE DELETED_PARENT AS ( 
SELECT * FROM MYLIB.MYPAYABLE 
WHERE PAYABLE_ID IN (SELECT ID FROM QTEMP.DELETED_CHILD) 
) WITH DATA WITH REPLACE NOT LOGGED; 

DELETE FROM MYLIB.MYCOST 
WHERE ID IN (SELECT ID FROM QTEMP.DELETED_CHILD); 

DELETE FROM MYLIB.MYPAYABLE 
WHERE PAYABLE_ID IN (SELECT PAYABLE_ID FROM QTEMP.DELETED_PARENT) ; 

select PAYABLE_ID, 'CHILD' TYPEDELETED FROM QTEMP.DELETED_CHILD 
union all 
select PAYABLE_ID, 'PARENT' TYPEDELETED FROM QTEMP.DELETED_PARENT ; 
0

如果外鍵關係已創建 「ON DELETE CASCADE

DELETE FROM PARENT 
     WHERE PARENT_ID in (
       SELECT CHILD_ID FROM CHILD_TABLE 
       WHERE CHILD_FIELD = 'XXXXX' 

如何設置Referential/Foreign Key Constraint

參考:W3Schools Foreign Key Constraint

ALTER TABLE MYLIB.MYCOST 
    ADD CONSTRAINT fk_MYCOST 
    FOREIGN KEY (PAYABLE_ID) 
    REFERENCES MYLIB.MYPAYABLE(PAYABLE_ID) 
    ON DELETE CASCADE 
    ON UPDATE RESTRICT 

參照Constaint注意事項:

  • 表日誌式
  • 父ID必須是唯一的IBM的I /主鍵