2016-12-26 3 views
0

In Oracle möchte ich Kind zu niedrigsten Elternwert zu füllen.
die Abfrage und führen
Wie fülle ich den gleichen Wert mit Kind Zeile

query: SELECT col1, col2 FROM DATA

Ergebnis:

+-----------+------+ 
| col1 | col2 | 
+-----------+------+ 
|  001 | a | 
| 001001 | b | 
| 001002 | c | 
| 001003 | d | 
| 001003001 | e | 
| 001003002 | f | 
|  002 | g | 
|  003 | h | 
| 003001 | i | 
| 003002 | j | 
+-----------+------+ 

col1 Schlüssel. und Kind-Index haben Eltern-Index.
Ich möchte dieses Ergebnis machen

+------+------+------+------+ 
| col1 | col2 | col3 | col4 | 
+------+------+------+------+ 
| a | b | b | b | 
| a | c | c | c | 
| a | d | e | e | 
| a | d | f | f | 
| g | g | g | g | 
| h | i | i | i | 
| h | j | j | j | 
+------+------+------+------+ 

wenn Eltern kein Kind haben, Kind Spalten Eltern füllen.
wie kann ich dieses ergebnis machen? ...
danke.

Antwort

0

Eine Möglichkeit, dies zu tun:

select c1, coalesce(c2, c1) c2, coalesce(c3, c2, c1) c3, coalesce(c4, c3, c2, c1) c4 
    from (select substr(path, 2, 1) c1, substr(path, 4, 1) c2, 
       substr(path, 6, 1) c3, substr(path, 8, 1) c4 
      from (select sys_connect_by_path(col2, ' ') path 
        from data 
       where connect_by_isleaf = 1 
       connect by substr(col1, 1, length(prior col1)) = prior col1 
        and length(prior col1) + 3 = length(col1) 
       start with length(col1) = 3)) 

Unter der Annahme, dass die Werte in col2 sind 1-char lange Sie können es wie oben tun. Andernfalls müssen Sie substr(path, ..., ...) mit instr() oder regulären Ausdrücken ändern.

Die innere Abfrage ist hierarchisch, wo ich nur ganzen Pfad aus Leaf-Zeilen auswählen. Äußere Abfragen legen Daten in bestimmte Spalten, die sich mit Nullwerten befassen. Wenn Sie mit Oracle 11g oder höher arbeiten Sie können dies wahrscheinlich auf elegantere Weise mit Recursive Subquery Factoring erreichen.


Testdaten und Ausgang:

create table data (col1 varchar2(10), col2 varchar2(1)); 
insert into data values ('001', 'a'); 
insert into data values ('001001', 'b'); 
insert into data values ('001002', 'c'); 
insert into data values ('001003', 'd'); 
insert into data values ('001003001', 'e'); 
insert into data values ('001003002', 'f'); 
insert into data values ('002', 'g'); 
insert into data values ('003', 'h'); 
insert into data values ('003001', 'i'); 
insert into data values ('003002', 'j'); 

C1 C2 C3 C4 
-- -- -- -- 
a b b b 
a c c c 
a d e e 
a d f f 
g g g g 
h i i i 
h j j j 

7 rows selected  
+0

Ihnen danken. Ich lerne "Rekursive Unterabfrage-Factoring" von Ihnen –

Verwandte Themen