2012-11-19 18 views
11

私はそれが一般的な問題だと感じているので、これを投稿するのは本当に嫌でしたが、この状況に当てはまる回答を見つけることはできません...ちょうど本当に悪いgoogler)。別のテーブルの複合キーに基づいて削除

私は2つの同一のテーブル(データではなく、列である)、table1とtable2を持っています。両方のテーブルに複合キー(col1、col2)が存在するtable1のレコードを削除したいとします。ここに私が持っているものがありますが、これは私には正しいようですが、間違いを投げかけています。

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 ','.

私は '赤いエラー波線' を持っているコードの部分の周囲に2 *を入れています。

+0

私はこれがSQL-SERVERだと思いますか? – gdoron

+0

はい、申し訳ありません。より具体的であったはずです。ここでは、SQL-SERVERをSQL、OracleをOracleと呼んでいます。 – Jeff

+0

OracleはSQL Serverよりもずっと古く、奇妙な大会ですが...あなたの上司を幸せにするなら、あなたはより豊かです。 – gdoron

答えて

18

これはきれいにお使いDELETEJOINを使用して行うことができます。

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サーバーの場合は、マイケルのソリューションが機能するはずです。

+0

これはHSQLDBでも動作します: 'delete from table1 where(col1、col2、col3)in(select col1、col2、col3 from someview123 where ...)' – binwiederhier

関連する問題