这个问题在这里已有答案:
我总是假设以下形式的陈述
SELECT * FROM A LEFT JOIN B ON (A.column1 = B.column2 AND B.column2 = 12321)
总是相当于
SELECT * FROM A LEFT JOIN B ON (A.column1 = B.column2)
WHERE B.column2 = 12321
更笼统地说:
SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY AND FILTER_ON(B))
WHERE FILTER_ON(A)
应该相当于
SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY)
WHERE FILTER_ON(A) AND FILTER_ON(B)
这似乎不是这种情况......第一种类型产生的结果行数大于第二种类型。
问题:在哪些情况下我的假设是错误的?
对于外部联接,它们不相同。
无论left join
子句是否为true,false或on
,NULL
都会将所有行保留在第一个表中。因此,仅在第一个表格中的on
中的条件无效。
如果要在left join
中的第一个表上进行过滤,请将条件放在where
中。第二个表格中的条件通常在on
条款中。
在您的第一个查询中,您编写了LEFT JOIN
,表示左侧表格中的所有数据。
查询:1
SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY AND FILTER_ON(A) AND FILTER_ON(B))
查询:2
SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY)
WHERE FILTER_ON(A) AND FILTER_ON(B)
在查询中:1,在LEFT JOIN
中有条件,这意味着当条件变为假时,我们仍然有LEFT边表所有数据和NULL
值与Table B
。
如果在where
中为table B
子句(查询:2)写条件,那么查询1和查询2的结果将会出现数据不匹配,因为数据将在查询结果中按条件过滤掉。