使用条件连接显示3个表中的数据

时间:2016-04-12 20:37:43

标签: sql oracle11g oracle-sqldeveloper plsqldeveloper

我有3张格式低于表格。

Table A                    Table B                   Table C   
id                         id1  id2                   id   name
1                          1    null                  1.1  john   
2                          1    1.1                   
                           2    null                  

使用查询

select a.id,b.id1,b.id2,c.id,c.name 
from TableA a 
join TableB b on a.id = b.id1
left join TableC on b.id2 = c.id

我会看到以下数据

a.id  b.id1  b.id2  c.id  c.name
1     1      null   null  null
1     1      1.1    1.1   john
2     2      null   null  null

我的意图是,我需要摆脱结果集中的第一行,即如果有数据则只显示非空行,如果没有数据则显示空行。

如果您需要清楚,请告诉我。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,这是使用rank的一个选项:

select *
from (
    select a.id,b.id1,b.id2,c.id,c.name,
        rank() over (partition by b.id1 
                       order by case when b.id2 is null then 1 else 0 end) rnk
    from TableA a 
        join TableB b on a.id = b.id1
        left join TableC on b.id2 = c.id
) t
where id2 is not null or rnk = 1

答案 1 :(得分:0)

您的重复内容全部来自TableB。您可以通过多种方式确定这些行的优先级。我认为最简单的数据方法是聚合:

select a.id, b.id1, b.id2, c.id, c.name 
from TableA a join
     (select b.id1, max(b.id2) as id2
      from TableB b
      group by b.id1
     ) b
     on a.id = b.id1 left join
     TableC
     on b.id2 = c.id;

答案 2 :(得分:0)

我们可以使用另一个表来存储一个解决方案,该表存储id2id1的{​​{1}}上至少存在非空值,如果存在则删除空值。

此表格为:

Tableb

查询:

select sum(case when id2 is null then 0 else 1 end) as test,
id1
from TableB
group by id1

因此,在您有多行的情况下,您将在一行中拥有所有select a.id,b.id1,b.id2,c.id,c.name from TableA a join TableB b on a.id = b.id1 left join TableC on b.id2 = c.id left join ( select sum(case when id2 is null then 0 else 1 end) as test, id1 from TableB group by id1 ) AS Table_test on Table_test.id1 = b.id1 where b.id2 is not null or Table_test.test = 0 ,并且没有空行,并且仅在空情况下您将保留空行。