2012-11-19 51 views
11

我一直都不願意發佈此,因爲我覺得這是一個常見的問題,但我似乎無法找到適用於這種情況的一個答案......(也許我只是一個非常糟糕的Google員工)。刪除基於另一個表中的複合鍵

我有兩個相同的表(逐列,而不是數據),Table 1和Table。我希望刪除table1中兩個表中存在組合鍵(col1,col2)的記錄。這是我所擁有的,這對我來說似乎是正確的,但卻是拋出一個錯誤。

DELETE FROM Table1 
WHERE (**Col1**, Col2) IN 
(SELECT Col1, Col2 
FROM Table1 a 
JOIN Table2 b 
    ON a.Col1 = b.Col1 
    AND a.Col2 = b.Col2) 

錯誤:

Msg 4145, Level 15, State 1, Line 212 An expression of non-boolean type specified in a context where a condition is expected, near ','.

我已經放了兩個*其中有 '紅色錯誤的波浪線' 的代碼部分的周圍。

+0

我相信這是SQL-SERVER? – gdoron

+0

是的,對不起。應該更具體。在這裏,我們只是將SQL-SERVER稱爲SQL,將Oracle稱爲Oracle。 – Jeff

+0

因爲Oracle比sql-server要「老」許多,但是......如果它讓你的老闆開心,並且你更富有,爲什麼不呢? – gdoron

回答

18

這可以使用JOIN用乾淨的執行DELETE

DELETE a 
FROM 
    Table1 a 
    JOIN Table2 b 
     ON a.Col1 = b.Col1 
     AND a.Col2 = b.Col2 
+0

該解決方案有效,但我希望你能解釋爲什麼我的不工作。我已經看到使用'(col1,col2)'語法的類似問題的解決方案。 – Jeff

+0

@Jeff適用於Oracle,但不適用於Sql Server ...它們使用略有不同的Sql方言,並不總是可以互換的。 –

+0

這是有道理的。我可以發誓我在某個時候在SQL-Server中使用了這種語法,但我可能是錯誤的。嘗試在SQL-Server,MySQL和Oracle之間保持語法是一團糟。謝謝! – Jeff

7

哪個DBMS是什麼呢?如果是在口頭上,那麼配對比較應該是有效的。

DELETE FROM Table1 
WHERE (Col1, Col2) IN 
(SELECT Col1, Col2 
FROM Table2) 

如果是SQL服務器,那麼Michael的解決方案應該可以工作。

+0

這也適用於HSQLDB:'從table1中刪除where(col1,col2,col3)in(選擇col1,col2,col3 from someview123 where ...)' – binwiederhier

相關問題