【问题标题】:left join and where condition in joining condition左加入和加入条件中的条件
【发布时间】:2017-11-26 20:54:56
【问题描述】:

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

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

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

【问题讨论】:

  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER JOIN ON 在 OUTER JOIN ON 删除任何由 NULL 扩展的行后,需要右 [sic] 表列不为 NULL,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。
  • 请use text, not images/links, for text--including tables & ERDs. 转述或引用其他文本。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。让您的帖子自成一体。

标签: sql join left-join ingres


【解决方案1】:

您不应该在 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' ;

where 条件是 INNER JOIN 子句的等效部分,这就是你有这种行为的原因..

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

【讨论】:

  • 谢谢,我也是这么想的,但不确定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2020-12-07
  • 2021-02-12
相关资源
最近更新 更多