SQL连接三个表,两个表中存在但不存在第三个表的行

时间:2017-01-12 18:00:06

标签: sql join db2 outer-join

我需要你的帮助。

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

image

我希望使用一个sql请求获取表B中存在或不存在的表A中的行,以及表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'                             
                       ) ;

Like this

3 个答案:

答案 0 :(得分:0)

如果在where子句中测试表B中的相等性,则左外连接或右外连接不取空 你没有在A和C之间加入,那么你可以做一个UNION ALL 但是你必须在selection子句中使用相同类型的列(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 ....

答案 1 :(得分:0)

你也可以进行交叉加入:

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 :(得分:0)

使用where existswhere not exists条款