2010-04-21 65 views
0

我要刪除所有記錄,其中從表中的字段名稱和AentryId = BentryId表B.幫助與Oracle查詢

如果我刪除從表A和同時相匹配的className = 10010 ENTRYID 12同樣的ID也應該從表B中刪除。

表A:

AentryId className  
12  10010 
13  10011 
14  10010 
15  10011 

表B:

BentryId name 
12   xyz 
13   abc 
14   aaa 

回答

2

要做到這一點,最簡單的方式是通過與CASCADE定義的外鍵DELETE:

alter table B 
    add constraint b_a_fk foreign key (BentryId) 
    references A (AentryId) 
    on delete cascade 
/

如果你從A的所有相關記錄刪除行在B中自動刪除。

當然,強制執行外鍵意味着您不能在B中創建任何行,但BentryId不會引用A中先前存在的AentryId。這通常是理想的事情,但不是每個數據模型都強制執行關係完整性。

編輯

刪除約束實在簡單得不能再簡單...

alter table B 
    drop constraint b_a_fk 
/
+0

我已經改變了我的表,如你所說。但是,現在我想刪除約束,出於某種原因...如何做到這一點? 您的迅速行動將受到高度讚賞。 – 2010-04-21 12:25:48

1

下面可能是最終的查詢您正在尋找

delete form TableA where class="10010" and AentryId in (select BentryId from tableB) 

級聯刪除是讓你的選項之一刪除孩子的數據並形成主表

否則你可以編寫查詢像下面

declare @T table (id int) 
    insert into @T 
     select AentryId form TableA where class="10010" and AentryId in (select BentryId from tableB) 

    delete form TableA where AentryId in (select id from @T) 
    delete form TableB where BentryId in (select id from @T) 
+0

這確實滿足了要求:需要從表B中刪除也是如此。 – APC 2010-04-21 10:12:33

+0

感謝您的查詢。但它是從TableA刪除行,而不是從TableB ... – 2010-04-21 11:22:09

+0

查詢被修改希望這會對你有用 – 2010-04-21 12:58:01