【问题标题】: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;

【问题讨论】:

  • 不,Left Join 不会跳过行,除非你有像table1.bankid >40 这样的 WHERE 条件来过滤连接的结果。应该改为与 ON。
  • 请显示您的查询和所需的结果。
  • 该行被跳过,因为您加入BankId (这意味着table2 列将是null 对于具有null BankId 的行,然后您检查(在WHERE) 如果table1.CompanyId=table2.CompanyId 基本上检查2 = null 是否为所述行。编辑:这是fiddle,第二个请求显示“原始”LEFT JOIN
  • 显示提供的源数据所需的输出。

标签: mysql sql


【解决方案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,它也会返回一行
      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2012-05-04
      相关资源
      最近更新 更多