LEFT OUTER JOINはどのようにして左のテーブルにあるよりも多くのレコードを返すことができますか?


165

私は非常に基本的なLEFT OUTER JOINを使用して、左側のテーブルのすべての結果と、より大きなテーブルのいくつかの追加情報を返します。左側のテーブルには4935レコードが含まれていますが、それを追加テーブルにLEFT OUTER JOINすると、レコード数が大幅に増えます。

LEFT OUTER JOINが左のテーブルのすべてのレコードを、右のテーブルの一致したレコードと一致しないすべての行のnull値とともに返すことは、私が知っている限り絶対的な福音です。左の表にあるよりも多くの行を返すことは不可能ですが、それはまったく同じです。

SQLクエリは次のとおりです。

SELECT     SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM         SUSP.Susp_Visits LEFT OUTER JOIN
                      DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum

おそらく、構文に誤りを犯したか、LEFT OUTER JOINの理解が不完全である可能性があります。うまくいけば、これがどのように発生するのか説明できますか?

追記

素晴らしい回答をありがとう、左外部結合の私の理解ははるかに良くなりましたが、誰でもこのクエリを変更して、左のテーブルに存在するのと同じ数のレコードのみが返されるようにする方法を提案できますか?

このクエリは純粋にレポートを生成するためのものであり、重複する一致は単に問題を混乱させます。

/追記


5
「左側のテーブルに存在するのと同じ数のレコードが返されるようにするには」、複数の一致がある場合に選択する右側の行を指定する必要があります。
AK、

1
これをどのように指定しますか?最初の試合を返却してください。
Simon Cross

1
最初の一致の意味を定義する必要があります。最も古いレコード、つまり最も高いIDを持つレコードが必要ですか?
HLGEM 2013年

1
追加のテーブルの主キーと一致する場合、ステートメントは正しいです。
Prageeth godage、2015年

クエリを作成するとき、私はよくこのようなリソースをチートシートとして使用します。リンクが停止した場合は、google sql joinだけです。これらは、さまざまなタイプの結合のベン図です。
ジマノ

回答:


190

LEFT OUTER JOINは、可能な場合はRIGHTテーブルと結合されたLEFTテーブルからすべてのレコードを返します。

一致がある場合でも、一致するすべての行が返されます。したがって、RIGHTの2つの行と一致するLEFTの1つの行は、INNER JOINのように2つのROWSとして返されます。

編集:あなたの編集への応答として、私はあなたのクエリをさらに調べたところ、あなたはLEFTテーブルからのみデータを返しているようです。したがって、LEFTテーブルからのデータのみが必要で、LEFTテーブルの各行に対して1行だけを返す場合は、JOINを実行する必要はまったくなく、LEFTテーブルから直接SELECTを実行できます。


1
右のテーブルに参加した理由は、右のテーブルに少なくとも1つのレコードがある左側からのレコードのみを取得したためです。説明をありがとうございました。
ジェイワイルド

125
Table1                Table2
_______               _________
1                      2
2                      2
3                      5
4                      6

SELECT Table1.Id, Table2.Id FROM Table1 LEFT OUTER JOIN Table2 ON Table1.Id=Table2.Id

結果:

1,null
2,2
2,2
3,null
4,null

1
とてもシンプルでありながら強力です。
kiradotee

39

それは不可能ではありません。左の表のレコード数は、返されるレコードの最小数です。右側のテーブルに左側のテーブルの1つのレコードと一致する2つのレコードがある場合、2つのレコードが返されます。


12

あなたの追記に応じて、それはあなたが何をしたいかに依存します。

結合条件に複数の一致があるため、左側のテーブルの各行で(可能性として)複数の行を取得しています。合計結果にクエリの左側にあるのと同じ数の行を含める場合は、結合条件によって1対1の一致が発生することを確認する必要があります。

または、実際に何をしたいかに応じて、集計関数を使用できます(たとえば、右側の部分の文字列だけが必要な場合は、その左側の行の右側の結果のコンマ区切りの文字列である列を生成できます。

1つまたは2つの列のみを外部結合から参照している場合は、1つの結果が保証されるため、スカラーサブクエリの使用を検討してください。


4
左のテーブルから行だけを返す方法に関する提案を提供したので、これは良い答えです。
2015

9

左側のテーブルの各レコードは、右側のテーブルに一致するレコードがある場合と同じ回数だけ返されます。少なくとも1つですが、簡単に1より多くなる可能性があります。


8

LEFT OUTER JOINは、INNER JOIN(通常の結合)と同様に、左側のテーブルの各行について、右側のテーブルで見つかったのと同じ数の結果を返します。したがって、最大N x Mまでの多くの結果が得られます。Nは左のテーブルの行数、Mは右のテーブルの行数です。

これは、LEFT OUTER JOINで少なくともNになることが常に保証される結果の最小数です。


1
行の数がN x Mになると思い始めましたが、頭に浮かぶのは、NまたはMが1になるときだけです。同意しますか?
BartoszMiller 2013

2
いいえ、ありません。結合条件をキーの等価結合のみと見なすべきではありません。日付範囲、不等式など、任意の条件にすることができます。2つの極端なケース:(a)N行がM行の中で単一の一致を持たない場合、左外部結合の結果、N行がNULLと一致します。(b)N行のすべてがM行のすべてと一致する場合、結果はN x M行のセットになります。
topchef 2013

1
そうです、私は結合をキーの平等の観点からのみ考えていました。「ケースb」の例が好きです。「N行のすべてがM行のすべてに一致する」は、N x M行が返される場合の一般的なレシピであると私は信じています。
BartoszMiller 2013


6

左外部結合を含むクエリの「右側」テーブルにwhere句がある場合は注意してください... where句を満たす右側にレコードがない場合は、「左側」の対応するレコード'テーブルはクエリの結果に表示されません...


1
次に、対応するLEFT OUTER JOINのON句に条件を追加する必要があります。
Mik

6

右側から1行だけ必要な場合

SELECT SuspReason, SiteID FROM(
    SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID, ROW_NUMBER()
    OVER(PARTITION BY SUSP.Susp_Visits.SiteID) AS rn
    FROM SUSP.Susp_Visits
    LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
) AS t
WHERE rn=1

あるいは単に

SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits WHERE EXISTS(
    SELECT DATA.Dim_Member WHERE SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
)

1
DDLとDMLを提供しなかったため、テストしませんでした。とにかく、EXISTSはあなたが望むものだと思います。これを試してください:SELECT SuspReason、SiteID FROM(SELECT SUSP.Susp_Visits.SuspReason、SUSP.Susp_Visits.SiteID、ROW_NUMBER()OVER(PARTITION BY SUSP.Susp_Visits.SiteID ORDER BY SUSP.Susp_Visits.SiteSP)ASrn FROM JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum)AS t WHERE rn = 1
AK


2

Dim_Memberの複数の(x)行がSusp_Visitsの単一の行に関連付けられている場合、resulセットにはx行があります。

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