ユニオンのように2つのクエリ結果をマージする必要がありますが、2つの結果の違いのみを保持したいと思います。これは可能ですか?
基本的に、クエリ1ですべてのリソースを選択し、クエリ2で許可されていないリソースを選択しています。最後の結果では、明らかに許可されたリソースが必要です。
疑似コードの場合:
Query1 - Query2
クエリ結果1:
+-------+
| id |
+-------+
| 1 |
+-------+
| 2 |
+-------+
| 3 |
+-------+
| 4 |
+-------+
| 5 |
+-------+
| 6 |
+-------+
クエリ結果2:
+-------+
| id |
+-------+
| 2 |
+-------+
| 5 |
+-------+
必要:
+-------+
| id |
+-------+
| 1 |
+-------+
| 3 |
+-------+
| 4 |
+-------+
| 6 |
+-------+
このように、NOT IN
を使用します:
SELECT id FROM queryOneTable
WHERE id NOT IN (
SELECT id FROM queryTwoTable
)
MySqlを持っていないので、SQLExpressでこのクエリをテストしました。私はそれが同じように機能すると思います。
select x.id
from x
left join y on x.id = y.id
where y.id is null
左結合アプローチは、一意性がone idではなく、複数の列値の組み合わせで構成される2つのテーブル(または任意の2つのクエリ結果セット)で使用できるため、より用途が広くなります。また、ネストされた選択を書き込むよりもパフォーマンスが高いため、外部結合(左)をマスターする方がSQL(または少なくとも以前はそうであった)として優れていると見なされます。
バージョン10.3のEXCEPT
には MariaDB
コマンドがあります。
一方、1つのフィールドだけでなく、完全な違いが必要な場合は、CONCAT
回避策を使用できます。アイデアは、最初のクエリのすべてのフィールドを連結して追加することです
HAVING CONCAT_WS(',', field_names) NOT IN (
SELECT CONCAT(',', fields) FROM other_query
)
フィールドの値にコンマを含めることができる場合は、コンマの代わりに別の区切り文字を選択してください。また、null値を含む可能性のあるフィールドのIFNULL
チェックを追加します。