如何为第一个表的空白或空值应用左连接?

Posted

技术标签:

【中文标题】如何为第一个表的空白或空值应用左连接?【英文标题】:How to apply left join for blank or null value of first table? 【发布时间】:2020-08-25 08:18:50 【问题描述】:

我有一个表作为表 1

BankId    |CompanyId|
23        | 2       |
24        | 2       |
31        | 2       |
NULL      | 2       |
83        | 1       |
          | 2       | 
          | 2       | 
29        | 7       | 

我有一个表作为表 2

   BankId      |CompanyId|AccountId|
        23        | 2       | 21
        24        | 4       | 22
        31        | 2       | 23
        45        | 2       | 24
        83        | 1       |
        12        | 2       | 20
        43        | 2       | 2
        29        | 7       | 

现在bankidcompany id 在这两个表中很常见。现在我想根据公司 id 从第一个表中获取所有记录并应用左连接。但问题是,如果我应用左连接,那么它会跳过第一个 bankid 为空的表中的条目。

请告诉我左连接查询应该是什么?

Sql查询

select table1.*,table2.AccountId
from table1
LEFT JOIN table2
  ON table1.Bankld=table2.BankId
WHERE table1.CompanyId=table2.CompanyId 
  AND table1.CompanyId=2;

【问题讨论】:

欢迎来到 SO。请看:Why should I provide an MCRE for what seems to me to be a very simple SQL query? 不,Left Join 不会跳过行,除非你有像table1.bankid >40 这样的 WHERE 条件来过滤连接的结果。应该改为与 ON。 请显示您的查询和所需的结果。 该行被跳过,因为您加入BankId (这意味着table2 列将是null 对于具有null BankId 的行,然后您检查(在WHERE) 如果table1.CompanyId=table2.CompanyId 基本上检查2 = null 是否为所述行。编辑:这是fiddle,第二个请求显示“原始”LEFT JOIN 显示提供的源数据所需的输出。 【参考方案1】:

WHERE table1.CompanyId=table2.CompanyId将结果转化为Inner Join,逻辑上先处理ON,再处理WHERE过滤器。

经验法则是:Outer Table 上的条件放在 WHERE,Inner Table 上的条件放在 ON

select table1.*,table2.AccountId
from table1
LEFT JOIN table2
  ON table1.Bankld=table2.BankId
 AND table1.CompanyId=table2.CompanyId -- condition on Inner Table
WHERE table1.CompanyId=2;              -- condition on Outer Table

【讨论】:

【参考方案2】:

对于提供的源数据,这是您想要的输出吗?

输出

bankid|companyid|accountid|
------|---------|---------|
23    |2        |21       |
31    |2        |23       |
24    |2        |         |
NULL  |2        |         |
      |2        |         |
      |2        |         |

查询

select table1.*,table2.accountid 
from table1 LEFT JOIN table2 
ON table1.bankid =table2.bankid and table1.companyid =table2.companyid
WHERE  table1.companyid =2;

【讨论】:

【参考方案3】:

使用时连接被破坏 table1 LEFT JOIN table2 ON table1.Bankld=table2.BankId 因为在 Join 中使用了 NULL 列

【讨论】:

连接没有被破坏,因为它是一个外部连接,即使 jon 条件不计算为 TRUE,它也会返回一行

以上是关于如何为第一个表的空白或空值应用左连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中提交具有空白或空值和非空白值的表单

为啥 Hashtable 不允许空键或空值?

MySQL左连接不返回连接表的空值

左连接计数来自第二个表的三个属性

左连接

比较数据集与左连接但防止空值影响结果