2016-09-15 1 views
0

У меня есть родитель и таблица ребенка присоединились parent_id, и я хочу, чтобы удалить строки из обеих таблиц с использованием значения в дочерней таблицеDB2 для я SQL удаления строк в 2-х таблиц, соединенных внешним ключом, используя значение детского

это то, что я пытался и не работает

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] Ключевое слово TABLE не ожидается. Действительные токены:) ЗАКЛЮЧИТЕЛЬНЫЙ СОЕДИНЕНИЕ ЗАКЛЮЧЕНИЯ.

Я хочу удалить всех детей за стоимость, а затем их родителей. Любая помощь приветствуется

+0

Какую версию IBM я? _Данные изменения таблиц_ могут не поддерживаться в более старых версиях. – mustaccio

+0

_data-change-table-reference_ разрешен в DB2 для i, начиная с версии 6.1, но только инструкции 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 Предостережения:

  • Таблицы Journaled
  • Родитель должен быть уникальным/Первичный ключ
Смежные вопросы