如何进行不重复父值的连接
How to make a join that not repeat parent values
我正在尝试制作一个不重复父值的 SQL。
查询:
select
p.name as parent_name,
c.name as children_name
from
parent p left outer join children c using(parent_id);
结果是:
PARENT_NAME | CHILDREN_NAME
Parent 1 | Children 1
Parent 1 | Children 2
Parent 1 | Children 3
Parent 1 | Children 4
Parent 2 | Children 1
Parent 2 | Children 2
Parent 2 | Children 3
Parent 2 | Children 4
但是,我的期望是(就像向下钻取):
PARENT_NAME | CHILDREN_NAME
Parent 1 | Children 1
<NULL> | Children 2
<NULL> | Children 3
<NULL> | Children 4
Parent 2 | Children 1
<NULL> | Children 2
<NULL> | Children 3
<NULL> | Children 4
SQL摆弄例子是:http://sqlfiddle.com/#!7/2e8f4/1
您可以使用 row_number()
和 case
表达式:
select
case when row_number() over(partition by p.parent_id order by c.id) = 1 then p.name end as parent_name,
c.name as children_name
from parent p
left outer join children c using(parent_id)
order by p.parent_id, c.id
如果您的 SQLite 版本不支持 window 函数,一种替代方法是相关子查询:
select
case when not exists (select 1 from children c1 where c1.parent_id = c.parent_id and c1.id < c.id) then p.name end as parent_name,
c.name as children_name
from parent p
left outer join children c using(parent_id)
order by p.parent_id, c.id
我正在尝试制作一个不重复父值的 SQL。
查询:
select
p.name as parent_name,
c.name as children_name
from
parent p left outer join children c using(parent_id);
结果是:
PARENT_NAME | CHILDREN_NAME
Parent 1 | Children 1
Parent 1 | Children 2
Parent 1 | Children 3
Parent 1 | Children 4
Parent 2 | Children 1
Parent 2 | Children 2
Parent 2 | Children 3
Parent 2 | Children 4
但是,我的期望是(就像向下钻取):
PARENT_NAME | CHILDREN_NAME
Parent 1 | Children 1
<NULL> | Children 2
<NULL> | Children 3
<NULL> | Children 4
Parent 2 | Children 1
<NULL> | Children 2
<NULL> | Children 3
<NULL> | Children 4
SQL摆弄例子是:http://sqlfiddle.com/#!7/2e8f4/1
您可以使用 row_number()
和 case
表达式:
select
case when row_number() over(partition by p.parent_id order by c.id) = 1 then p.name end as parent_name,
c.name as children_name
from parent p
left outer join children c using(parent_id)
order by p.parent_id, c.id
如果您的 SQLite 版本不支持 window 函数,一种替代方法是相关子查询:
select
case when not exists (select 1 from children c1 where c1.parent_id = c.parent_id and c1.id < c.id) then p.name end as parent_name,
c.name as children_name
from parent p
left outer join children c using(parent_id)
order by p.parent_id, c.id