我已经阅读了SO的一些帖子,我理解了where子句和on子句中的过滤之间的区别。但是大多数这些示例都是在RIGHT表上进行过滤(使用左连接时)。如果我有如下查询:
select * from tableA A left join tableB B on A.ID = B.ID and A.ID = 20
返回值不是我的预期。我原以为它首先过滤左表并只获取ID = 20的行,然后用tableB进行左连接。
当然,这在技术上应与:
相同select * from tableA A left join table B on A.ID = B.ID where A.ID = 20
但我认为如果你可以在进行连接之前过滤表格会更好。有人可以告诉我如何处理这个SQL并帮助我彻底理解这一点。
答案 0 :(得分:4)
left join
遵循一条简单的规则。它将所有行保留在第一个表中。列的值取决于on
子句。如果没有匹配,则相应表格的列为NULL
- 无论是第一个还是第二个表。
所以,对于这个查询:
select *
from tableA A left join
tableB B
on A.ID = B.ID and A.ID = 20;
A
中的所有行都在结果集中,无论是否匹配。当id不是20时,行和列仍然来自A
。但是,条件为false,因此B
中的列为NULL
。这是一个简单的规则。它不取决于条件是在第一个表还是在第二个表上。
对于此查询:
select *
from tableA A left join
tableB B
on A.ID = B.ID
where A.ID = 20;
from
子句保留A
中的所有行。但是where
子句会产生影响。并且它过滤行,所以只有id 20s在结果集中。
使用left join
时:
where
子句。on
子句。答案 1 :(得分:0)
你从tablea获得的地方,你可以放一个像from的子查询(从表格X中选择x。*,其中x.value = 20)TA
然后像之前做过的那样参考TA。
可能查询优化器会为您执行此操作。
Oracle应该有办法显示查询计划。在sql语句之前加上“解释计划”。从两个方面看看计划,看看它的作用。
答案 2 :(得分:0)
在您的第一个SQL语句中,A.ID=20
未在技术上加入任何内容。连接用于将两个单独的表连接在一起,ON
语句通过将列关联起来来连接列。
WHERE
语句允许通过减少仅在该特定列下可以找到该值的位置返回的行数来过滤数据。