A – ( B ∩ A )
SQL(演算子)と比較して、この一連の数学を見て、何に変換できるのか疑問に思っていました。
A
とB
が同じ「タイプ」(対応する列の列数と互換性のあるデータ型) のテーブルである場合、これは次のように SQL に変換できます。
A EXCEPT (A INTERSECT B)
もちろん、これは(集合代数と関係代数の両方で)次のものと同等です。
A EXCEPT B
A
とが異なる「タイプ」B
のテーブルである場合、集合操作はそれらの間では意味がありません。(結合は別のものです。それらを「説明」するリンクがどれほど人気があっても、結合、差異、または交差と混同しないでください。)
結合、差異、および交差もいくつかの方法で表現できるという事実 (明示的な,および演算子に加えて(LEFT) JOIN
、 , (NOT) IN
, の(NOT) EXISTS
組み合わせを使用) は、それを変更しません。UNION
EXCEPT
INTERSECT
構文は上記のとおりではありません。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)