web-dev-qa-db-ja.com

MySQL-2つのクエリ結果の「違い」を取得することは可能ですか?

ユニオンのように2つのクエリ結果をマージする必要がありますが、2つの結果の違いのみを保持したいと思います。これは可能ですか?

基本的に、クエリ1ですべてのリソースを選択し、クエリ2で許可されていないリソースを選択しています。最後の結果では、明らかに許可されたリソースが必要です。

疑似コードの場合:

Query1 - Query2

クエリ結果1:

+-------+
|  id   |
+-------+
|   1   |
+-------+
|   2   |
+-------+
|   3   |
+-------+
|   4   |
+-------+
|   5   |
+-------+
|   6   |
+-------+

クエリ結果2:

+-------+
|  id   |
+-------+
|   2   |
+-------+
|   5   |
+-------+

必要:

+-------+
|  id   |
+-------+
|   1   |
+-------+
|   3   |
+-------+
|   4   |
+-------+
|   6   |
+-------+
17
Ropstah

このように、NOT INを使用します:

SELECT id FROM queryOneTable
WHERE id NOT IN (
    SELECT id FROM queryTwoTable
)
49
nickf

MySqlを持っていないので、SQLExpressでこのクエリをテストしました。私はそれが同じように機能すると思います。

select x.id
from x 
left join y on x.id = y.id
where y.id is null
4
John Fisher

左結合アプローチは、一意性がone idではなく、複数の列値の組み合わせで構成される2つのテーブル(または任意の2つのクエリ結果セット)で使用できるため、より用途が広くなります。また、ネストされた選択を書き込むよりもパフォーマンスが高いため、外部結合(左)をマスターする方がSQL(または少なくとも以前はそうであった)として優れていると見なされます。

1
Sven

バージョン10.3のEXCEPTには MariaDB コマンドがあります。

一方、1つのフィールドだけでなく、完全な違いが必要な場合は、CONCAT回避策を使用できます。アイデアは、最初のクエリのすべてのフィールドを連結して追加することです

HAVING CONCAT_WS(',', field_names) NOT IN (
  SELECT CONCAT(',', fields) FROM other_query
)

フィールドの値にコンマを含めることができる場合は、コンマの代わりに別の区切り文字を選択してください。また、null値を含む可能性のあるフィールドのIFNULLチェックを追加します。

0
izogfif