多个自然联接中的值将被跳过

时间:2018-07-16 18:20:08

标签: oracle

我正在编写代码,以更好地格式化已确认使用自然连接的作品的输出。我得到的输出(如下所示)几乎与使用其他代码获得的正确输出完美匹配,除了它错过了连接“内部”的值。我知道自然连接方法会跳过这一步,但是我不确定该如何显示它。

使用自然联接代码

    select * from

    (
    select * from
    ((select part_num, num as a0   from Parts where num = :asm0) 
    natural left join 
    (select part_num, num as a1   from Parts where num = :asm1)
    natural left join
    (select part_num,  num as a2 from Parts where num = :asm2)
    natural left join
    (select part_num,  num as a3 from Parts where num = :asm3))
    where a1 is null or a2 is null or a3 is null

    union

    select * from
    ((select part_num, num as a0   from Parts where num = :asm0) 
    natural right join 
    (select part_num, num as a1   from Parts where num = :asm1)
    natural right join
    (select part_num,  num as a2 from Parts where num = :asm2)
    natural right join
    (select part_num,  num as a3 from Parts where num = :asm3))
    where a0 is null
    )

我得到了输出

    Number            A0          A1            A2              A3
    351-2927-060                 944-3234-016   944-3234-212    944-3234-242
    351-2930-330    944-3234-010                944-3234-212    
    351-2930-430                **Should have 016 here**        944-3234-242   
    351-3487-344                                944-3234-212    944-3234-242

使用我知道的不同代码返回我得到的正确输出

    Number          A's
    351-2927-060    944-3234-242
    351-2930-330    944-3234-010
    351-2930-330    944-3234-212
    351-2930-430    944-3234-016 shows the missing number
    351-2930-430    944-3234-242
    351-3487-344    944-3234-212
    351-3487-344    944-3234-242 

有没有办法让我使用自然联接方法显示此值?

1 个答案:

答案 0 :(得分:0)

最近学到了这一点,但有一个完全连接之类的东西可以完成我想做的事情。

select * from
(
(select part_num, num as a0   from Parts where num = :asm0) 
natural full join 
(select part_num, num as a1   from Parts where num = :asm1)
natural full join
(select part_num,  num as a2 from Parts where num = :asm2)
natural full join
(select part_num,  num as a3 from Parts where num = :asm3)
)
where a0 != any(a1,a2,a3) or a1 != any (a2,a3) or a2 != any(a3)