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 只会在结果集中出现一次。所以我很困惑为什么我得到的结果比原始 TABLE_ONE 查询中的实际结果多。

更新

解释更多我想了解的内容。结果查询(不使用COUNT)会产生类似这样的结果。

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

我不明白为什么在JOIN不满足 2 个条件时添加行。

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';

左外连接即使没有匹配也会带来所有记录在第二种情况下AND t2.FIELD_TWO = 'Goodbye,这是左外连接的一部分,因此它会带来匹配和不匹配的记录

于 2013-08-16T17:38:05.560 回答
0

WHERE 条件在 JOIN 条件之后应用,因此删除了所有包含 NULL 的记录t2.FIELD_TWO,从而有效地否定了 JOIN 的“OUTER”部分的用途。

于 2013-08-16T17:37:35.040 回答