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

And*_*rey 1 sql join ingres left-join

我正在使用 Ingres 11.0 DB 不确定它是否会在其他 DB 引擎上具有相同的行为,但就是这样

 SELECT * 
 FROM table1 t1
 LEFT JOIN table2 t2
   ON t1.id = t2.fk_id 
 WHERE t1.code = 'CODE1' AND t2.id_number = 12174;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

不返回表 1 中的所有记录,但我使用的是左连接,它应该从 T1 返回 aa 记录,并且只从 t2 返回行,只返回 1 条记录

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

SELECT *
FROM TABLE1 t1
LEFT JOIN TABLE2 t2
  ON  t1.id = t2.fk_id 
  AND t2.id_number = 12174
WHERE t1.code = 'CODE1'; 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

问题是为什么它在 where 子句中的所有搜索条件都不起作用,但是当我从 where 移动 t2.id_number 加入条件时起作用?

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

sca*_*dge 8

您不应在 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' ;
Run Code Online (Sandbox Code Playgroud)

where 条件是 INNER JOIN 子句的等效部分,这就是您具有此行为的原因。

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