1

なぜ次のことが起こるのかを理解しようとしています(以下のコード例)。

-- Returns 1,000
SELECT COUNT(*)
FROM TABLE_ONE t1
WHERE t1.FIELD_ONE = 'Hello';

-- Returns 1,000
SELECT COUNT(*)
FROM TABLE_ONE t1
LEFT OUTER JOIN TABLE_TWO t2 ON t2.TABLE_ONE_ID = t1.ID
WHERE t1.FIELD_ONE = 'Hello'
AND t2.FIELD_TWO = 'Goodbye';

-- Returns 83,500
SELECT COUNT(*)
FROM TABLE_ONE t1
LEFT OUTER JOIN TABLE_TWO t2 ON (t2.TABLE_ONE_ID = t1.ID AND t2.FIELD_TWO = 'Goodbye')
WHERE t1.FIELD_ONE = 'Hello';   

JOIN左外部結合では、右の値が見つからない場合でも常に左の値が含まれることを理解しています。ただし、句に条件を追加すると、 JOIN.

たとえば、TABLE_ONE からのエントリ A がある場合、2 つの条件を満たす TABLE_TWO 値を探します。見つからない場合は、空白になります。しかし、そのエントリ A は結果セットに 1 回しか表示されません。そのため、元の TABLE_ONE クエリに実際にあるものよりも多くの結果が得られる理由がわかりません。

アップデート

私が理解しようとしていることをもっと説明するために。結果のクエリ (を使用しないCOUNT) は、次のような結果になります。

Table_One_Name    Table_Two_Value
+++++++++++++++++++++++++++++++++++
Entry A           Goodbye
Entry A           
Entry A
Entry A
Entry B           Goodbye
Entry B

JOIN2 つの条件が満たされない場合に行が追加される理由がわかりません。

4

2 に答える 2

1
Where clause

レコードをフィルタリングします。最初のケースには追加の条件があります AND t2.FIELD_TWO = 'Goodbye' which filters more records(about 73,500 records)

-- Returns 1,000
SELECT COUNT(*)
FROM TABLE_ONE t1
LEFT OUTER JOIN TABLE_TWO t2 ON t2.TABLE_ONE_ID = t1.ID
WHERE t1.FIELD_ONE = 'Hello'
AND t2.FIELD_TWO = 'Goodbye';

左外部結合は、一致がない場合でもすべてのレコードを取得します 2番目のケースAND t2.FIELD_TWO = 'Goodbyeでは、これは左外部結合の一部であるため、一致するレコードと一致しないレコードが取得されます

于 2013-08-16T17:38:05.560 に答える