如何进行不重复父值的连接

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