简体   繁体   English

DB2 for i SQL使用子值删除由外键联接的2个表中的行

[英]DB2 for i SQL delete rows in 2 tables joined by foreign key using child value

I have a parent and a child table joined by parent_id and I want to delete rows from both tables using a value in the child table 我有一个由parent_id连接的父表和一个子表,我想使用子表中的值从两个表中删除行

this is what I tried and it is not working 这是我尝试过的,它不起作用

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
);

The Error I get is 我得到的错误是

Error code -199, SQL state 42601: [SQL0199] Keyword TABLE not expected. 错误代码-199,SQL状态为42601:[SQL0199]关键字TABLE不正确。 Valid tokens: ) FETCH ORDER UNION EXCEPT. 有效令牌:)捕获订单联合(例外)。

I want to delete all the children per value and then their parents. 我要删除每个值的所有孩子,然后删除其父母。 Any help is appreciated 任何帮助表示赞赏

Someting like this 像这样

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 ;

If the Foreign Key relationship has been created with " ON DELETE CASCADE " 如果已使用“ ON DELETE CASCADE ”创建了外键关系

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

How to setup the Referential / Foreign Key Constraint : 如何设置引用/外键约束

Refer to: W3Schools Foreign Key Constraint 参考: W3Schools外键约束

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

Referential Constaint Caveats: 引用约束警告:

  • Tables Journaled 记录表
  • Parent ID must be Unique/Primary Key 家长ID必须是唯一/主键

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM