如何为第一个表的空白或空值应用左连接?
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 |
现在bankid
和company 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,它也会返回一行以上是关于如何为第一个表的空白或空值应用左连接?的主要内容,如果未能解决你的问题,请参考以下文章