我有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
我的意图是,我需要摆脱结果集中的第一行,即如果有数据则只显示非空行,如果没有数据则显示空行。
如果您需要清楚,请告诉我。
答案 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)
我们可以使用另一个表来存储一个解决方案,该表存储id2
中id1
的{{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
,并且没有空行,并且仅在空情况下您将保留空行。