【问题标题】:SQL selecting from multiple tables to show even null values [duplicate]SQL从多个表中选择以显示甚至空值[重复]
【发布时间】:2017-06-27 17:59:55
【问题描述】:

我有 3 个具有外键 ACCOUNT_NO 的表,第一个表是 CREDIT_LIST,其中包含从银行提取的所有信用,第二个表是 CUSTOMERS 保存客户信息,最后一个是 ACCOUNTS 保存有关帐户本身的所有信息。当我尝试选择时

SELECT 
    B.CUSTOMER_NO AS CUSTOMER_NO,
    B.CREDIT_TYPE AS CREDIT_TYPE,
    B.ACCOUNT_NO AS CREDIT_ACCOUNT_NUMBER,
    A.BRANCH_CODE AS BRANCH_CODE,
    C.EXTERNAL_ACCOUNT_NO AS EXTERNAL_ACCOUNT_NUMBER
FROM 
    CREDIT_LIST B,
    CUSTOMERS A,
    ACCOUNTS C
WHERE   
    B.STATUS = 'A' -- ACTIVE
    AND A.CUSTOMER_NO = B.CUSTOMER_NO
    AND C.ACCOUNT_NO = B.ACCOUNT_NO
    ;

我得到零结果,因为 ACCOUNTS 中没有 EXTERNAL_ACCOUNT_NO,它具有 c.account_no = b.account_no。问题是即使没有 EXTERNAL_ACCOUNT_NO 我也想显示信息并用 null 填充它,例如:

| CUSTOMER_NO | CREDIT_TYPE | CREDIT_ACCOUNT_NUMBER | BRANCH_CODE | EXTERNAL_ACCOUNT_NUMBER
+-------------+-------------+-----------------------+-------------+------------------------
|     1       | some_type   | 123456                | 01          | 
|     2       | some_type   | 654321                | 01          | 111111111111

我觉得这非常愚蠢,但无法弄清楚我到底做错了什么

【问题讨论】:

  • 使用显式连接而不是过时的旧式连接
  • 然后使用LEFT JOIN

标签: sql oracle select


【解决方案1】:

我想,这就是你需要的

SELECT 
    B.CUSTOMER_NO AS CUSTOMER_NO,
    B.CREDIT_TYPE AS CREDIT_TYPE,
    B.ACCOUNT_NO AS CREDIT_ACCOUNT_NUMBER,
    A.BRANCH_CODE AS BRANCH_CODE,
    C.EXTERNAL_ACCOUNT_NO AS EXTERNAL_ACCOUNT_NUMBER
FROM 
    CREDIT_LIST B
    JOIN     CUSTOMERS A on A.CUSTOMER_NO = B.CUSTOMER_NO
    LEFT JOIN ACCOUNTS C on C.ACCOUNT_NO = B.ACCOUNT_NO
WHERE   
    B.STATUS = 'A' -- ACTIVE
;

左连接将确保您从 A 和 B 获得详细信息,即使 C 中没有可用数据。

另外,AS 是多余的,并不是必须的,您可以在查询的第 4 行写 B.ACCOUNT_NO CREDIT_ACCOUNT_NUMBER

左外连接 - Reference

不建议,但是,如果有原因,你需要使用旧语法,下面是你需要的

SELECT 
    B.CUSTOMER_NO AS CUSTOMER_NO,
    B.CREDIT_TYPE AS CREDIT_TYPE,
    B.ACCOUNT_NO AS CREDIT_ACCOUNT_NUMBER,
    A.BRANCH_CODE AS BRANCH_CODE,
    C.EXTERNAL_ACCOUNT_NO AS EXTERNAL_ACCOUNT_NUMBER
FROM 
    CREDIT_LIST B,
    CUSTOMERS A,
    ACCOUNTS C
WHERE   
    B.STATUS = 'A' -- ACTIVE
    AND A.CUSTOMER_NO = B.CUSTOMER_NO
    AND C.ACCOUNT_NO(+) = B.ACCOUNT_NO -- (+) will do a outer join for you
    ;

【讨论】:

  • 就我个人而言,我发现AS 关键字在定义列别名时很有帮助,我希望 Oracle 也支持表别名。
  • 那么a1 join a2 on a1.id = a2.id 是否与select * from a1, a2 where a1.id = a2.id 相同?
  • @Hatik - 是的。另一种方法是,select * from a1 join a2 using (id); 如果列名相同,我更喜欢using (column_name)
猜你喜欢
  • 2020-10-16
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2021-04-03
相关资源
最近更新 更多