別のテーブルと結合しない行を除外するにはどうすればよいですか?


86

2つのテーブルがあり、1つには主キーがあり、もう1つには外部キーとしてあります。

セカンダリテーブルにそのキーを含むエントリがない場合にのみ、プライマリテーブルからデータをプルしたい。そのキーで結合する行のみを返す単純な内部結合の反対のようなものです。

回答:


269

代替テキスト

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

結合の完全な画像 代替テキスト

aticleから:http//www.codeproject.com/KB/database/Visual_SQL_Joins.aspx


9
最後に!なぜ彼らは教科書にこれらを持っていないのですか、そしてなぜ大学の私の講師はこれらを持っていなかったのですか?!彼らは、これらに遠く離れてではなく、世界で可能な限り最悪の説明を使用しました!
pythonian29033 2014

4
これは金です。内容はないが大げさな褒め言葉は嫌いですが、どうぞ!これは素晴らしい答えです。ありがとう、@ PranayRana。
0xbe5077ed 2016

1
私に説明してください、なぜですB.Key IS NULLが、私たちはまだ匹敵しA.Key = B.Keyますか?
Do Nhu Vy 2016

1
@DoNhuVyは単純です。比較は「ON」句で行われ、一致する行がない場合はLEFTまたはRIGHT結合で、すべてNULLの行が結合されます。その後、IS NULLをテストして、一致する行がないことを確認します。 。(ちなみに、これは、テストしているフィールドがNULLでない場合、つまり他の理由でNULLを持つことができない場合にのみ機能します)
Gregory Magarshak 2017

次のクエリを使用しています:SELECT A. * FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JobFileId AND A.AccountID = B.AccountID WHERE A.JobFileId IS NULL OR B.JobFileId IS NULL AND A.AccountIDがNULLまたはB.AccountIDがNULL基本的に、「ON」句で2つの値を比較する2つがあります。正常に機能していますが、クエリは一致しない行に対してnull行を返します。これを解決する方法は?助けてください
HarshSharma

10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

一般的に、または(NOT) EXISTSより良い選択です(NOT) IN(LEFT) JOIN


彼はDBRMSが使用されているものを投稿しませんでしたが、MySqlではLEFT JOINパフォーマンスが優れていますNOT EXIST
スクラムマイスター

@スクラムマイスター:私はもっと速く言いましたか?IN vs EXISTS vs JOINを検索して、意味的および論理的な違いを
見つけてください

@gbn申し訳ありませんが、「より良い選択」とは、より速いという意味だと思いました。それでは、どのようにそれがより良い選択であるかを説明できますか? explainextended.com/2009/09/18/...
スクラムマイスター

1
@The Scrum Meister:一般に、どのような種類のJOINでもDISTINCTが必要になる場合があります。リストにnullが含まれているNOTINはfalseになります。IN / EXISTSは同じように動作します。ただし、不整合が気に入らない限り、唯一の「安全な」構成は(存在しない)存在です
gbn 2010




3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

2
質問があります。条件P.key = S.keyを使用してから「」と言うとwhere S.key IS NULL、P.keyもnullになりませんか?
ソムジット2015年

2

2番目のテーブルにも存在する最初のテーブル "から列を選択する場合は、この場合も使用できますEXCEPT。この場合、列名も異なる可能性がありますが、データ型は同じである必要があります。

例:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable

0

これは、CognosでSQLの「Notin」ステートメントを作成することが許可されていたため、COGNOSでの使用に役立ちましたが、実行に時間がかかりすぎました。CognosのテーブルBに結合するテーブルAをA.key "not in" B.keyとして手動でコーディングしましたが、クエリに時間がかかりすぎるか、5分後に結果が返されませんでした。

Cognosで「NOTIN」ソリューションを探している他の人のために、これが私がしたことです。リンクタイプを選択して、CognosでテーブルAとBをLEFT JOINで結合するクエリを作成します。テーブルA.KeyのテーブルBに「0からN」の値があり、テーブルBのフィルタ(これらはWhere句に対応)を追加します。 .KeyがNULLです。

速く走り、魅力のように。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.