2015-10-08 55 views
0

我設計如下查詢我的刪除操作沒有更好的方法。我是SQL新手,只想在這裏查看有經驗的人,如果沒問題,或者有更好的方法來做到這一點。我使用的DB2數據庫有沒有寫這個查詢

DELETE FROM TableD 
    WHERE B_id IN 
    ( 
     SELECT B.B_id 
      FROM TableB tB 
      INNER JOIN TableA tA 
       ON tB.A_id = tA.A_id 
      WHERE A_id = 123 
    ) AND 
    C_id IN (1,2,3) 

這有兩個IN子句對此我有點擔心,不知道如果我可以使用EXISTS子句的任何地方。

數據庫結構如下:

  • 表A具有一個與表B
  • 表B MANY關係具有一個與表C
  • 表B MANY關係具有一個與表MANY關係d
  • 表d具有複合主鍵(B_ID,C_ID)

表d數據有點類似於下面

B_id|C_id 
    ---------- 
    1 | 1 
    1 | 2 
    1 | 3 
    2 | 4 
    2 | 5 
    3 | 5 

這裏我必須刪除具有C_id數組值的行。但由於該指數是B_ID和D_ID的複合,我通過平等運營商獲取相關B_ID表A的特定實體A_ID = 123

+1

你是什麼意思與 「好」?對於給定的數據庫設計和存儲的數據更好?如果是,那麼請添加關於它的信息。如果你指的是格式,好了,是的,查詢看起來不錯... :) –

+0

哈哈:P當然,我會加入更多的細節。 2分鐘:) – Raja

+0

我增加了更多的細節Data_henrik – Raja

回答

1

不一定有什麼不對你的方法。然而,一個有用的替代技術,知道是merge

merge into TableD 
using ( 
    select distinct 
     B.B_id 
     from TableB tB 
     inner join TableA tA on 
      tB.A_id = tA.A_id and 
      A_id = 123 
) AB 
on 
    TableD.B_id = AB.B_id and 
    C_id in (1,2,3) 
when matched then delete; 

注意,我不得不使用distinct在內部查詢,以防止重複匹配。

0

DELETE FROM表D tD型 WHERE EXISTS(SELECT tB.B_id FROM 表B TB WHERE A_ID = 123 AND tB.B_id = tD.B_id ) AND C_ID IN(1,2, 3)

1

您可以使用合併這樣太:

merge into TableD 
    using TableB tB 
    on B.B_id = TableD.B_id 
    and tB.A_id in (select A_id from TableA tA where A_id = 123) 
    and C_id in (1,2,3) 
    when matched then delete; 
+0

不幸的是我沒有足夠的聲譽反對票您複製dan1111回答:|。 – Raja

+0

這是使用合併,不是我回答的副本不同的方式 –

+0

啊,沒關係,我的錯誤道歉,然後(: – Raja

相關問題