我试图理解为什么会发生以下情况(下面的示例代码)。
-- 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
子句中的操作。{ 1}}。
因此,例如,如果我从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个条件时添加行。
答案 0 :(得分: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
中,这是左外连接的一部分
所以它带来了匹配和不匹配的记录
答案 1 :(得分:0)
WHERE条件在t2.FIELD_TWO
中包含NULL的所有记录,从而有效地否定了JOIN的“OUTER”部分的用途。