左连接和连接条件中的条件

left join and where condition in joining condition

我正在使用 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;

不会 return 来自 table 1 的所有记录,但我正在使用左连接,这应该 return aa 来自 T1 的记录并且只处理来自 t2 的行 ,return只有1条记录

如果我将一个条件从 where 子句移动到加入条件它的开始 return 我正是我所期待的

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 从 where 移动到连接条件时却起作用?

我想我知道答案,因为我在加入步骤中消除了 t2 中所有可能的变化,但现在不确定

您不应在 where 条件中使用与左 table 相关的列(这作为 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' ;

where 条件是 INNER JOIN 子句的等效部分,这就是您出现这种行为的原因。

将条件添加到 on 子句意味着添加的条件也可以用作外部连接..