【问题标题】:SQL join on three tables, lines that exist in 2 tables but not the third三个表上的 SQL 连接,存在于 2 个表中但不存在于第三个表中的行
【发布时间】:2026-02-15 08:40:01
【问题描述】:

我需要你的帮助。

假设我们有 3 个表 A、B 和 C,如下图所示:

我想使用一个sql请求获取表A中存在或不存在于表B中的行,以及表C中存在或不存在于表B中的行。

我试过了,但是不行:

SELECT A.ATS0804, C.ATS0207, A.ATS0959, A.ATS0802, B.ATS0827                                     
          FROM 
          ISUT183.ENS0042 B
          RIGHT JOIN ISUT183.ENS0038 A
          ON B.ENS0038K = A.ATS0804
          RIGHT JOIN ISUT183.EN00041 C  
          ON   B.EN00041K = C.AT02812

                WHERE ( C.ATS0207 = '0001757430' 
                   AND   B.ATS0823 = '9999-01-01'
                   AND   A.ATS0803 = '9999-01-01'
                   AND   A.ATS0959 = '61384352001' 
                 AND   A.ATS0802 ='01.01.2010'                             
                       ) ;

【问题讨论】:

    标签: sql join db2 outer-join


    【解决方案1】:

    你也可以做交叉连接:

    with AB as (
    select * from A left outer join B on A.ID1=B.ID1
    ),
    AC as (
    select * from C left outer join B on C.ID2=B.ID2
    )
    select * from AB CROSS JOIN AC
    

    【讨论】:

      【解决方案2】:

      使用where existswhere not exists 子句

      【讨论】:

        【解决方案3】:

        如果在 where 子句中对表 B 进行相等性测试,左外连接或右外连接不取 null 你没有 A 和 C 之间的连接,那么你可以做一个 UNION ALL 但是你必须在 selects 子句中使用相同类型的列(ID1 与 ID2 相同)

        select * from ( 
        select 'A-B' typejoin,  A.ID1 as IDA_OR_C, B.ID1 as IDB from A left outer join B on A.ID1=B.ID1
        union all
        select 'A-C' typejoin, C.ID2 as IDA_OR_C, B.ID2  as IDB from C left outer join B on C.ID2=B.ID2
        ) tmp
        where ....
        

        【讨论】:

        • 感谢您的回答,但是哪里可以放 where 条件呢?
        最近更新 更多