当我进行左连接时,我仍然无法从左表中获取数据?

Posted

技术标签:

【中文标题】当我进行左连接时,我仍然无法从左表中获取数据?【英文标题】:When I do left join, I am still not able to get data from left table? 【发布时间】:2021-12-28 06:08:46 【问题描述】:

条件是我知道右表没有与左表匹配的所有记录。

但我仍然无法从左表获取数据,右表为空

select a.sales, b.profit 
from T1 a 
  left join T2 b on a.id = b.id
where b.category = 'office'
  and b.code = '245'

由于右表的where条件,右表没有匹配的记录, 没有where条件我得到了记录。

我的问题是,尽管使用左连接保留左表记录,但左表会受到右表 where 条件的影响。

【问题讨论】:

如果T2 中没有匹配项,则b.code = '245' 不可能为真,因为b.code IS NULL。将WHERE 条件移动到连接条件 是的,它会受到影响。右表上的 WHERE 将 LEFT JOIN 转换为 INNER。我想您可以尝试将查询重写为 SELECT A.SALES, B.PROFIT FROM T1 A LEFT JOIN (SELECT X.ID,X.PROFIT FROM T2 X WHERE X.CATEGORY='OFFICE' AND X.CODE='245 ')B ON A.ID=B.ID 这能回答你的问题吗? Left Outer Join doesn't return all rows from my left table? 【参考方案1】:

您的WHERE 子句强制查询仅返回b.categoryb.code 匹配所需值的行,非NULL 匹配;这有效地将您的JOIN 条件转换为INNER JOIN

您想将过滤器放在连接条件中:

select a.sales,
       b.profit 
from   T1 a 
       left join T2 b
       on (   a.id = b.id
          AND b.category = 'office'
          AND b.code = '245')

或者在子查询中预过滤T2

select a.sales,
       b.profit 
from   T1 a 
       left join (
         SELECT *
         FROM   T2
         WHERE  category = 'office'
         AND    code = '245'
       ) b
       on a.id = b.id

【讨论】:

以上是关于当我进行左连接时,我仍然无法从左表中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

SQL从左表中获取左连接值

如何在实体框架中的两个表之间进行左连接操作时从左表中选择唯一行

数据库操作中,左连接,右连接是啥意思,举例说明

SQL左连接不包括左表中的所有记录

左外连接不返回左表中的所有行?

如何从左表中仅获取一条记录与右表中的每条记录