2016-07-13 10 views
0

Ich habe eine Tabelle/Ergebnismenge wie:Sortieren einer Ergebnismenge nach einem Eigenschaftswert von ‚Eltern‘ lesen property.Please die Details

Name | Property_Name | Property Value 

Jack  School   public school 
Jack  Age    12 
Jack  Parent   Julia 
Mary  Parent   Samantha 
Mary  School   Brookes School 
Mary  Age    8 
Julia  Occupation  Teacher 
Julia  Age    32  
Julia  Salary   3000 
Jone  School   private school 
Jone  Parent   David 
Jone  Age    10 
David  Occupation  Plumber 
David  Age    35 
David  Salary   2500 
Samantha Occupation  Nurse 
Samantha Salary   3500 
Samantha Age    30 
Samantha Parent   Peter 
Peter  Occupation  Retired 
Peter  Age    59 
Peter  Salary   0 

möchte ich das Ergebnis eingestellt, wie parent-child-child, parent-child, parent child sortiert werden und so auf. Das heißt, sollte das Ergebnis wie:

Name | Property_Name | Property Value 

Peter  Occupation  Retired 
Peter  Age    59 
Peter  Salary   0 
Samantha Occupation  Nurse 
Samantha Salary   3500 
Samantha Age    30 
Samantha Parent   Peter 
Mary  Parent   Samantha 
Mary  School   Brookes School 
Mary  Age    8 
Julia  Occupation  Teacher 
Julia  Age    32  
Julia  Salary   3000 
Jack  School   public school 
Jack  Age    12 
Jack  Parent   Julia 
David  Occupation  Plumber 
David  Age    35 
David  Salary   2500 
Jone  School   private school 
Jone  Parent   David 
Jone  Age    10 

Wie Sie den Rest der Eigenschaften sehen können, irrelevent sind. Einzige Bedingung: Alle Zeilen einer Person sollten gruppiert werden, und untergeordnete Zeilen sollten sofort den Zeilen des übergeordneten Elements folgen (falls vorhanden). Diese übergeordneten Zeilen sollten den Zeilen "super Eltern" (falls vorhanden) folgen.

Was sollte der beste Ansatz dafür sein? Jede Hilfe würde sehr geschätzt werden.
Entschuldigung, wenn es ein Duplikat ist, please mich, wenn überhaupt.

+1

schlechtes Design, schönes Problem zu lösen. –

+0

Es wäre schön, wenn Sie ein Skript zum Einfügen von Testdaten zur Verfügung stellen würden. –

+0

Nicht wirklich schlechtes Design, wenn man bedenkt, dass es tatsächlich Hunderte von Eigenschaften für jede "Person" gibt, und die Eigenschaften variieren auch von Region zu Region, Sprache zu Sprache usw – Arnab

Antwort

0

starten (Ich füge noch ein Kind für mehr Fälle zu Julia. Sie hat zwei Kinder jetzt) ​​

with t(Name,Property_Name , PropertyValue) as (
select 'Jack',  'School',   'public school' from dual union all 
select 'Jack',  'Age',    '12' from dual union all 
select 'Jack',  'Parent',   'Julia' from dual union all 
select 'Mike',  'School',   'public school' from dual union all 
select 'Mike',  'Age',    '15' from dual union all 
select 'Mike',  'Parent',   'Julia' from dual union all 
select 'Mary',  'Parent',   'Samantha' from dual union all 
select 'Mary',  'School',   'Brookes School' from dual union all 
select 'Mary',  'Age',    '8' from dual union all 
select 'Julia',  'Occupation',  'Teacher' from dual union all 
select 'Julia',  'Age',    '32' from dual union all 
select 'Julia',  'Salary',   '3000' from dual union all 
select 'Jone',  'School',   'private school' from dual union all 
select 'Jone',  'Parent',   'David' from dual union all 
select 'Jone',  'Age',    '10' from dual union all 
select 'David',  'Occupation',  'Plumber' from dual union all 
select 'David',  'Age',    '35' from dual union all 
select 'David',  'Salary',   '2500' from dual union all 
select 'Samantha', 'Occupation',  'Nurse' from dual union all 
select 'Samantha', 'Salary',   '3500' from dual union all 
select 'Samantha', 'Age',    '30' from dual union all 
select 'Samantha', 'Parent',   'Peter' from dual union all 
select 'Peter',  'Occupation',  'Retired' from dual union all 
select 'Peter',  'Age',    '59' from dual union all 
select 'Peter',  'Salary',   '0' from dual), 
    parents(name) as 
    (select distinct name 
     from t parent 
     where not exists (select * 
       from t all_rec 
       where all_rec.Property_Name = 'Parent' 
       and all_rec.name = parent.name)), 
    hierarhy(name, 
    parent, 
    lv, 
    rn) as 
    (select alls.*, level, rownum as rn 
     from (select name, null as parent 
       from parents 
       union all 
       select name, PropertyValue 
       from t childs 
       where Property_Name = 'Parent') alls 
     connect by parent = prior Name 
     start with parent is null 
     order siblings by name desc) 
    select t.* 
     from hierarhy, t 
    where hierarhy.name = t.name 
    order by hierarhy.rn, hierarhy.lv, t.Property_Name, t.PropertyValue