2017-03-24 6 views
0

Ich stehe vor einem lästigen Problema und ich möchte etwas Hilfe.Hierarchische Abfragen in Join

Dies ist die Situation.

CREATE TABLE tree_hierarchy (
    id  NUMBER (20) 
,parent_id NUMBER (20) 
); 
CREATE TABLE tree_information (
    id  NUMBER (20) 
,some_text VARCHAR(20) 
,tree_id NUMBER (20) 
); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (2, null); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (4, 2); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (9, 4); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (20, null); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (40, 20); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (90, 40); 
INSERT INTO tree_information (id, some_text, tree_id) VALUES (10,'Some teste', 2); 
INSERT INTO tree_information (id, some_text, tree_id) VALUES (11,'Other tree', 20); 

Und ich möchte so etwas tun.

SELECT hier.* 
    FROM tree_information Ti 
    JOIN (
     SELECT 
      id, 
      parent_id 
     FROM tree_hierarchy th 
     where connect_by_isleaf = 1 
     START WITH th.id = ti.tree_id 
     CONNECT BY PRIOR th.id = th.parent_id 


) hier on 1=1; 

aber ti.tree_id ist in der Auswahl nicht sichtbar.

Wenn ich den Start mit der Bedingung ändern für

START WITH th.parent_id is null 

Wird falsch bleiben. Jemand hat eine Idee, wie man diese Situation lösen kann?

+0

Können Sie bitte zeigen, was Ihre erwartete Ausgabe sein sollte? – OldProgrammer

+0

"Hier ist, was ich tun möchte" und dann zeigen Sie Code, der NICHT tut, was Sie tun möchten (das ist, warum Sie dies an erster Stelle veröffentlichen). Wie sollen wir also erraten, was Sie tun wollen? Aus Code, der es NICHT tut, und sonst nichts? Bitte sehen Sie, was OldProgrammer oben geschrieben hat. – mathguy

Antwort

0

Ich würde mich freuen, wenn Sie das erwartete Ergebnis explizit angeben. Meine beste Schätzung ist:

SELECT hier.*, ti.* 
    FROM tree_information Ti 
    JOIN (
     SELECT 
      id, 
      parent_id, 
      connect_by_root th.id as tree_id 
     FROM tree_hierarchy th 
     where connect_by_isleaf = 1 
     START WITH th.id in (select tii.tree_id from tree_information Tii) 
     CONNECT BY PRIOR th.id = th.parent_id 
) hier on ti.tree_id = hier.tree_id; 

ID PARENT_ID TREE_ID ID SOME_TEXT TREE_ID 
9   4   2 10 Some teste  2 
90   40  20 11 Other tree  20