我正在使用Ingres 11.0 DB,不确定它是否会在其他数据库引擎上有相同的行为,但这里是
select * FROM table1 t1
left join table2 t2
ON t1.id = t2.fk_id WHERE t1.code = 'CODE1' AND
t2.id_number = 12174;
不会返回表1中的所有记录,但是我使用的是左连接,它应该从T1返回一个记录,并且只从t2中加工一行 ,只返回1条记录
如果我将一个标准从where子句移动到join条件,那么它的起始返回我正是我所期待的
SELECT *
FROM TABLE1 t1
left join TABLE2 t2
ON t1.id = t2.fk_id AND
t2.id_number = 12174
WHERE t1.code = 'CODE1';
问题是为什么它不能在where子句中的所有搜索条件下工作,但是当我从哪里移动t2.id_number时工作?
我想我知道答案,因为我在连接步骤中消除了t2中所有可能的变化,但现在确定
答案 0 :(得分:2)
你不应该在where where条件(这个工作作为INNER JOIN)中使用与左表相关的列,在相关的ON子句中移动左连接的条件
select *
FROM table1 t1
left join table2 t2
ON t1.id = t2.fk_id AND t2.id_number = 12174
WHERE t1.code = 'CODE1' ;
条件是INNER JOIN子句的等效部分,这就是你有这种行为的原因..
将条件添加到on子句意味着添加的条件也可用作外连接..