2017-08-23 11 views
-2

テーブルAとテーブルBがあります。AとBを結合したいが、結合が不可能な場合のみ結果が必要です。私は試しましたSQL Joinは一致するものがない場合に結果を返します。

SELECT B.* 
     FROM A 
RIGHT JOIN B ON A.KEY = B.KEY 
    WHERE A.KEY IS NULL 

これは動作するはずですが、そうではありません。私のSQLは正しいですか?

+2

「ヌル」のキーにどのように参加できますか? – BenM

+0

何が返されますか? –

+0

NULL値を比較するために=を使用することはできないので、 'A.KEY = B.KEY'は' A.KEY'がヌルのときは機能しませんので、うまくいきません。 https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html – ADyson

答えて

2

あなたは「動作しませんでした」で何を意味するか言わなかったが、これらのクエリのいずれかの場合:

SELECT B.* 
FROM A 
RIGHT JOIN B ON A.KEY = B.KEY 
WHERE A.KEY IS NULL 

SELECT A.* 
FROM A 
LEFT JOIN B ON A.KEY = B.KEY 
WHERE B.KEY IS NULL 

リターン・ノーの結果は、それが固体のテーブル内のすべてのキーがと一致していることを意味します外部結合テーブルの少なくとも1つのキー

あなたが他に一致する行を持たないAまたはBのいずれかの行を見つけるためにしようとしている場合は、次のようなクエリ必要があります:あなたは、人々が言っ​​て、「しかし、A聞こえるかもしれません

SELECT A.*, B.*, CASE WHEN A.KEY IS NULL THEN 'in B but not A' WHEN B.KEY IS NULL THEN 'in B but not A' END as explanation 
FROM A 
FULL OUTER JOIN B ON A.KEY = B.KEY 
WHERE A.KEY IS NULL OR B.KEY IS NULL 

をキーは、/主キーがnullであることはできないため、nullになることはありません。 - はい、私たちは参加しています。彼らはテーブルのプライマリキーですが、参加が発生した後で必ずしもプライマリキーであるとは限りません。データベースは、キーが値と等しい行がBにない場合、Aからの実際の値でいっぱいの行とペアになったB(b.key列を含む)のNULL値でいっぱいの行を生成することができますa.keyの - これは、テーブルのキーがもはや結合のキーではなく、nullであることを意味します。

キー以外の列に対してヌルでテストできますか?はい。ただし、テーブルの他の列がNOT NULLABLEでない場合、キー列は、不一致の行を探している場合に使用するのに最適な列です。これは、2つのテーブルが結合されている状況でnullを含むことが保証できる唯一のカラムであり、このテーブルに他のテーブルと一致するデータがないからです。

もっと説明すると、 :

A 
key|val 
------- 
000|hello 
001|world 

B 
key|val 
------- 
000|hello 
002|there 
  • この2つのテーブルのみがこの2つのテーブルが左にB.KEYがNULL IS A.KEY = B/KEY ON BをJOINである場合000
  • をもたらす行内側に接合されている場合、行001が発生する
  • これらの2つのテーブルがA RIGHT JOIN BO N A.KEY A.KEYがNULL IS = B/KEY、これら二つtagblesがいっぱい外であれば002
  • をもたらす行がまたはbキーがnullである場合、行001および002は、

をもたらすであろう参加しましたAまたはBのいずれかのkey列にNULLが含まれていると、その行は結合結果に表示されません。

+0

これはありがとうございました! –

-3

答えを見つけました。

これが機能しない理由は、JOINではAND条件を使用していたためで、WHERE句では使用されなかったためです。

ありがとうございます。

+3

あなたは実際に*あなたが実行していたクエリではない "動作していない"クエリを投稿しましたか?お元気ですか... –

+0

元のスニペットには「AND」状態さえありませんでしたか? – BenM

+0

私はこれを簡単にして、人々が答えるのを簡単にしました。申し訳ありませんが可能なら削除します。 –

関連する問題