A – ( B ∩ A )
SQL(演算子)と比較して、この一連の数学を見て、何に変換できるのか疑問に思っていました。
AとBが同じ「タイプ」(対応する列の列数と互換性のあるデータ型) のテーブルである場合、これは次のように SQL に変換できます。
A EXCEPT (A INTERSECT B)
もちろん、これは(集合代数と関係代数の両方で)次のものと同等です。
A EXCEPT B
Aとが異なる「タイプ」Bのテーブルである場合、集合操作はそれらの間では意味がありません。(結合は別のものです。それらを「説明」するリンクがどれほど人気があっても、結合、差異、または交差と混同しないでください。)
結合、差異、および交差もいくつかの方法で表現できるという事実 (明示的な,および演算子に加えて(LEFT) JOIN、 , (NOT) IN, の(NOT) EXISTS組み合わせを使用) は、それを変更しません。UNIONEXCEPTINTERSECT
構文は上記のとおりではありません。EXCEPTいずれかを使用できます (Postgres および SQL-Server で動作します。 を に置き換えると、Oracle でも動作しますMINUS):
SELECT *
FROM a
EXCEPT
( SELECT *
FROM a
INTERSECT
SELECT *
FROM b
) ;
またはこれ (Postgres 8.4 以降で動作: SQL-Fiddle test )
SELECT *
FROM
( TABLE a
EXCEPT
( TABLE a INTERSECT TABLE b )
) t ;
そしてこれでさえ(見て、いやSELECT!):
TABLE a
EXCEPT
( TABLE a INTERSECT TABLE b ) ;
SQLに関して別のオプションを提供するだけです:
SELECT id FROM A
MINUS
SELECT id FROM B
更新:
MINUS最終的な結果セットから重複を削除し、Oracle にのみ存在することに注意してください。
SQL 標準では、他のベンダーでサポートされている EXCEPT を使用します。
SELECT id FROM A
EXCEPT
SELECT id FROM B
標準ではDISTINCT、重複を削除するオプションがあります。重複が削除されるかどうかを確認するには、特定のベンダーのドキュメントを確認する必要があると思います。たとえば、SQL Server の実装はOracleEXCEPTと同じです。MINUS
これは A と B の集合差を計算し、 in mats も と同等A - Bです。ここで興味があるのは、B にはない A の要素です。
このブログ投稿を見て、mysql で集合差分を行う方法を確認できます。
それは SET A MINUS (SET A INNER JOIN SET B) です。A と B の両方で発生するレコードを取得し (INNER JOIN)、SET A (MINUS) からそれらを削除します。
集合論用語での交差は、SQL 用語での INNER JOIN と同等です。
編集:NOT INと同じであるというあなたの質問については、そうではありません。NOT IN は、列の値 (「選択」) で使用される演算子です。MINUS、JOIN などは、行のセット間で操作を実行するためのセット演算子です。
A – ( B ∩ A )同等ですA LEFT OUTER JOIN B WHERE TableB.id IS null

別のオプションは、使用することです
SELECT * FROM A
WHERE
NOT EXISTS (SELECT * FROM B WHERE A.Id = B.id)