2012-10-01 176 views
25

我對Oracle Sql查詢並不十分熟悉,因此我在從必須滿足包含另一個(加入)表的字段的約束的表中刪除某些行時遇到問題。換句話說,我想編寫一個查詢來刪除行,包括JOIN。在Oracle sql查詢中使用「Join」刪除

在我的情況下,我有一個表ProductFilters和另一個表Products加入字段ProductFilters.productID = Products.ID。我想從ProductFilters刪除ID高於或等於200的行,並且它們引用的產品具有名稱'Mark'(名稱是Product中的字段)。

我想先通知JOIN在Oracle中的刪除查詢中是否可以接受。如果不是我應該怎麼修改此查詢,以使其工作,因爲該表格上我收到一個錯誤:

DELETE From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
(
    Select rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
);  
+0

你得到的錯誤是什麼? – davek

+0

是的,你可以刪除使用連接:請參閱這裏http://stackoverflow.com/a/3675205/110933 – davek

回答

21

基於我鏈接到我的上述評論的答案,這應該工作:

delete from 
(
select pf.* From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
    (
    Select rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
) 
); 

delete from PRODUCTFILTERS where rowid in 
(
select pf.rowid From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
    (
    Select PRODUCTFILTERS.rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
) 
); 
+0

我試過第二個,我收到錯誤:「列不明確定義」。除此之外,我認爲在開始處的正確語法是刪除PRODUCTFILTERS其中...在刪除查詢中,「發件人」是多餘的。 – arjacsoh

+0

好吧,我已經爲嵌套rowid引用添加了限定符。 – davek

+1

好的,這次它的工作 – arjacsoh

48

近日筆者瞭解到以下語法:

DELETE (SELECT * 
     FROM productfilters pf 
     INNER JOIN product pr 
      ON pf.productid = pr.id 
     WHERE pf.id >= 200 
      AND pr.NAME = 'MARK') 

我認爲它看起來比其他提議的代碼更清潔。

+0

確實很乾淨。使用這個進展,讓其他人更容易理解到底是什麼被刪除。 – user2025696

+0

這個主題比主要通過where條件而不是join的主題更快。 –

+0

只是想補充一點,如果JOIN與某個集合(某個表的某個集合)一起出現,則會出現一個錯誤,因爲沒有DML可以在PL/SQL集合上運行。不錯的語法。 – Alfabravo