2013-05-21 39 views
4

如何使用CTE和INNER JOIN從表中刪除數據?這是有效的語法,所以應該這項工作:如何使用CTE和INNER JOIN刪除行?

with my_cte as (
select distinct var1, var2 
from table_a 
) 
delete 
from table_b b inner join my_cte 
    on var1 = b.datecol and var2 = b.mycol; 

回答

7

在Oracle既不CTE也不INNER JOIN是有效的DELETE命令。這同樣適用於INSERTUPDATE命令。

一般來說,最好的選擇是使用DELETE ... WHERE ... IN

DELETE FROM table_b 
WHERE (datecol, mycol) IN (
    SELECT DISTINCT var1, var2 FROM table_a) 

您也可以從一個子查詢的結果中刪除。在docs中涵蓋(儘管很輕鬆)。

+1

不需要子查詢中的'distinct'(這與'IN'運算符相關) –

+0

謝謝 - 我從來不知道,我一直認爲它會優化通過限制子查詢結果,但我從來沒有真正檢查執行計劃來驗證,我會仔細看看今晚。 DISTINCT在我的查詢中是否有任何傷害? –

+0

如果Oracle只是從子查詢中刪除'distinct',我不會感到驚訝,所以我想從性能的角度來看並不重要。 –

0

嘗試下面的方法: -

從表-B b其中存在( 與my_cte作爲刪除( 選擇不同VAR1,從表-A VAR2 ) 從my_cte選擇1 其中a.var1 = B。 datecol和a.var2 = b.mycol;