和JOIN与WHERE中的AND语句

时间:2013-08-16 17:31:32

标签: sql oracle join

我试图理解为什么会发生以下情况(下面的示例代码)。

-- 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个条件时添加行。

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”部分的用途。