在多个表上独家左连接

时间:2014-11-05 19:42:42

标签: sql oracle

我正构建一个查询,我尝试在其中进行独占的左连接但我找不到解决方案而不使用与union all一起放置的两个查询。

我的SQL没有按预期工作:

select link_table.key as lk_key, table_a.key as a_key, table_b.key as b_key
from link_table
left join table_a on (link_table.key = table_a.key_link_table)
left join table_b on (link_table.key = table_b.key_link_table)

我得到的结果是:

lk_key     a_key   b_key
123        abc     xyz
456        def     uvw
789        ghi     NULL

我的解决方法:

select link_table.key as lk_key, table_a.key as a_key, null as b_key from link_table
left join table_a on (link_table.key = table_a.key_link_table)
union all
select link_table.key as lk_key, null as a_key, table_b.key as b_key from link_table
left join table_b on (link_table.key = table_b.key_link_table)

我得到的结果是什么,并希望第一个SQL执行:

lk_key     a_key   b_key
123        abc     NULL
123        NULL    xyz
456        def     NULL
456        NULL    uvw
789        ghi     NULL

这可以在一个查询中使用吗?

2 个答案:

答案 0 :(得分:0)

重新格式化问题:请使用代码将此内容放入此处。

select 
link_table.key as lk_key,
table_a.key as a_key,
table_b.key as b_key 
    from link_table 
left join table_a on 
    (link_table.key = table_a.key_link_table) 
left join table_b on 
    (link_table.key = table_b.key_link_table)

我得到的结果是:

lk_key a_key b_key 
123 abc xyz 
456 def uvw 
789 ghi NULL

通缉结果:

lk_key a_key b_key
123 abc NULL 
123 NULL xyz 
456 def NULL 
456 NULL uvw  
789 ghi NULL

我的解决方法

select * from link_table 
left join 
table_a on (link_table.key = table_a.key_link_table) 

union all 

select * 
from link_table 
left join table_b on 
  (link_table.key = table_b.key_link_table)

试试这个:

select 
link_table.key as lk_key,
table_a.key as a_key,
table_b.key as b_key 
    from link_table 
full outer join table_a on 
    (link_table.key = table_a.key_link_table) 
full outer join table_b on 
    (link_table.key = table_b.key_link_table)
where a_key is NULL or
b_key is NULL

http://i.stack.imgur.com/qje6o.png

答案 1 :(得分:0)

union all 一个查询。这是一个由两部分组成的查询。

如果连接到两个表不会在第二个表中产生重复,您也可以这样做:

select link_table.key as lk_key, table_a.key as a_key, table_b.key as b_key
from link_table left join
     table_a
     on link_table.key = table_a.key_link_table left join
     table_b
     on link_table.key = table_b.key_link_table;

这并不完全等效,因为如果table_atable_b中存在多个匹配项,则可能会产生重复项。但是,在你的情况下,它可能会做你想要的。