2016-10-19 6 views
2

ich habe 2 Tabellen: 'Eltern' und 'Kind'Gruppe von UNION Ergebnis

KIND:

ID | NAME  | PARENT_ID 
-------------------------------- 
1 | Child 1  | 1 
2 | Child 2  | 1 
3 | Child 3  | 1 
4 | Child 4  | 1 
5 | Child 5  | 1 
6 | Child 6  | 2 
7 | Child 7  | 2 
8 | Child 8  | 2 
9 | Child 9  | 2 
10 | Child 10 | 2 
11 | Child 11 | 2 
12 | Child 12 | 2 
13 | Child 13 | 2 
14 | Child 14 | 2 
15 | Child 15 | 3 
16 | Child 16 | 3 
17 | Child 17 | 3 

ELTERN:

ID | NAME  | UNIQUE_ID 
---------------------------------- 
1 | PARENT 1 | uniq-001 
2 | PARENT 2 | uniq-002 
3 | PARENT 3 | uniq-003 

ich diese zwei Tabelle Union wollen und bekommen Ergebnis wie folgt

ID | NAME  | PARENT_ID 
--------------------------------- 
1 | parent 1 | 1 
1 | child 1  | 1 
2 | child 2  | 1 
2 | parent 2 | 2 
6 | child 6  | 2 
7 | child 7  | 2 
12 | child 12 | 2 
13 | child 13 | 2 
14 | child 14 | 2 
3 | parent 3 | 3 
15 | child 15 | 3 

mein SQL-Code sieht lik e

select * from 
(
SELECT 
    id, 
    name, 
    id as parent_id 
from 
    parent 
UNION all 
SELECT 
    id, 
    name, 
    parent_id 
from 
    child 
) t 
group by 3, 1, 2 

Ich weiß nicht warum, aber das Ergebnis wird nicht von PARENT_ID gruppiert. Wie kann ich diese Abfrage nach PARENT_ID gruppieren?

+0

Funktioniert es, wenn Sie t angeben Die Spalten explizit? ('group by parent_id, id, name') –

+2

Willst du einfach eine' order by'? –

+0

@GordonLinoff, ich möchte nach jedem Elternteil seine Kinder anzeigen – Nasay

Antwort

1

Ich fürchte, die Frage ist nicht klar genug. Hier sind zwei Vorschläge für den Start.

Dudu


select  id 
      ,name 
      ,unique_id 

from  (   select 2,id,parent_id,name,null  from child 
      union all select 1,id,id  ,name,unique_id from parent 
      ) t (source_order,id,pid,name,unique_id) 

order by pid 
      ,source_order 
      ,id 
; 

id  name  unique_id 
--  ----  --------- 
1  PARENT 1 uniq-001 
1  Child 1  
2  Child 2  
3  Child 3  
4  Child 4  
5  Child 5  
2  PARENT 2 uniq-002 
6  Child 6  
7  Child 7  
8  Child 8  
9  Child 9  
10  Child 10  
11  Child 11  
12  Child 12  
13  Child 13  
14  Child 14  
3  PARENT 3 uniq-003 
15  Child 15  
16  Child 16  
17  Child 17 

select  p.* 
      ,(select array_agg ('(' || c.id || ') ' || c.name order by c.id) from child as c where c.parent_id = p.id) as children 

from  parent as p 

order by p.id 
; 

id name  unique_id childrn 
-- ----  --------- ------- 
1 PARENT 1 uniq-001 (1) Child 1 ,(2) Child 2 ,(3) Child 3 ,(4) Child 4 ,(5) Child 5 
2 PARENT 2 uniq-002 (6) Child 6 ,(7) Child 7 ,(8) Child 8 ,(9) Child 9 ,(10) Child 10,(11) Child 11,(12) Child 12,(13) Child 13,(14) Child 14 
3 PARENT 3 uniq-003 (15) Child 15,(16) Child 16,(17) Child 17 
Verwandte Themen