1

私はこれを理解するのに苦労しています。

Jeff Atwood によると、SQL 結合の視覚的な説明左外部結合は、テーブル A から完全なレコード セットを生成し、一致するレコード (利用可能な場合) をテーブル B に生成します。一致するレコードがない場合、右側には null が含まれます。

左のテーブル (TableA) には重複がありません。右側の tableB には、クライアント番号ごとに 1 つまたは 2 つのエントリがあります。PrimaryTP は一方を 1 でプライマリとして指定し、もう一方は 0 を指定します。

And B.PrimaryTP = 1TableA には重複がないため、この行を含める必要はありません。しかし、それを省略すると、クライアント番号が重複します。なんで?

これがどのように機能するかを理解するのを手伝ってもらえますか。それは私を非常に混乱させています。の論理は私をAnd B.PrimaryTP = 1逃れます。それでもうまくいくようです。それでも、わからないと信用するのが怖いです。それを理解するのを手伝ってもらえますか。または、クエリに論理エラーが隠されていますか?

SELECT A.ClientNum --returns a list with no duplicate client numbers
FROM (...<TableA>
) as A

Left Outer Join

<TableB> as B
on A.ClientNum = B.ClientNum

--eliminate mismatch of (ClientNum <> FolderNum)
Where A.ClientNum Not In
(
    Select ClientNum From <TableB>
    Where ClientNum Is Not Null
    And ClientNum <> IsNull(FolderNum, '')
)

--eliminate case where B.PrimaryTP <> 1
And B.PrimaryTP = 1 
4

5 に答える 5

1

INNER JOINanと aの違いは、テーブル B に対応する行がない場合でも、 がテーブル A の行を返すLEFT JOINことだけです。LEFT JOIN

ただし、それはまだJOINです。つまり、テーブル B に対応する行が複数ある場合、テーブル A の行をそれぞれの行に結合します

したがって、テーブル A の各行に対して複数の結果が得られないようにする場合は、テーブル B から複数の行が見つからないようにする必要がありますAnd B.PrimaryTP = 1

于 2013-11-12T16:50:32.963 に答える
0

は、 のすべての一致するレコードを含むのすべてLEFT OUTER JOINのレコードを提供します。との違いは、B に一致するレコードがない場合、結合では A からのレコードが完全に省略されますが、結合には からの結果を含む行が含まれます。ABINNER JOININNERLEFTA

ただし、あなたの場合は、DISTINCTキーワードもチェックアウトすることをお勧めします。

于 2013-11-12T16:51:59.307 に答える