将过滤条件放在join on语句中是否等效? [重复]

问题描述 投票:2回答:2

这个问题在这里已有答案:

我总是假设以下形式的陈述

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)

这似乎不是这种情况......第一种类型产生的结果行数大于第二种类型。

问题:在哪些情况下我的假设是错误的?

sql oracle
2个回答
4
投票

对于外部联接,它们不相同。

无论left join子句是否为true,false或onNULL都会将所有行保留在第一个表中。因此,仅在第一个表格中的on中的条件无效。

如果要在left join中的第一个表上进行过滤,请将条件放在where中。第二个表格中的条件通常在on条款中。


1
投票

在您的第一个查询中,您编写了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的结果将会出现数据不匹配,因为数据将在查询结果中按条件过滤掉。

© www.soinside.com 2019 - 2024. All rights reserved.