web-dev-qa-db-ja.com

LEFT OUTER JOINは、左のテーブルに存在するレコードよりも多くのレコードを返すことができますか?

左のテーブルのすべての結果と、より大きなテーブルのいくつかの追加情報を返す、非常に基本的な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の理解が不完全です。誰かがこれがどのように発生するかを説明できるといいのですが。

追記

LEFT OUTER JOINSについての私の理解は非常によくなりましたが、このクエリを変更して、左のテーブルに存在するだけのレコードが返されるようにする方法を誰かが提案できますか?

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

/追記

140
Jay Wilde

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

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

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

158
Robin Day
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
98
Andrew Lewis

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

30
HLGEM

あなたのポストスクリプトに応じて、それはあなたが望むものに依存します。

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

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

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

10

左側のテーブルの各レコードは、右側のテーブルに一致するレコードの数だけ返されます。少なくとも1つですが、1を超えることもあります。

8
Alex Martelli

LEFT OUTER JOINは、INNER JOIN(通常の結合)と同様に、左のテーブルの各行に対して、右のテーブルで見つかった一致と同じ数の結果を返します。したがって、多くの結果を得ることができます-最大N xM。ここで、Nは左表の行数、Mは右表の行数です。

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

7
topchef

左右のテーブルの1対多の関係になりますか?

6
Ken Burkhardt

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

6
Serge

右側から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
)
4
A-K

SUSP.Susp_Visitsの行ごとにDATA.Dim_Memberテーブルに複数の行があるようです。

1
bdukes

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

1
Manu