2012-03-26 2 views
0

Ich versuche, rekursiv einige Daten mithilfe von connect by, die für jede Zeile muss ich wissen, ob in einem anderen Baum enthält ein bestimmtes Element.Zugriff Eltern Alias ​​in Unterabfrage innerhalb einer With-Klausel mit Verbindung durch in Oracle

So habe ich diese [abgespeckte] query:

select m.id, m.name, 
    (select (
    with recursiveMetaClass as (
      select mb.name 
      from meta mb 
      start with mb.id = m.id 
      connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
    ) select name from recursiveMetaClass where name in ('config_group', 'config_item') 
    ) from dual) as basetype 
from meta m 
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 

Dieser Fehler allerdings mit ORA-00904 "M" "ID". Ungültiger Kennung auf m.id in Anfang mit in meiner verschachtelten Abfrage. Wenn ich durch Abfrage mit ersetzen:

select m.id, m.name, 
    (select (
    with recursiveMetaClass as (
      select mb.name 
      from meta mb 
      start with mb.id = 1004 
      connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
    ) select name from recursiveMetaClass where name in ('config_group', 'config_item') 
    ) from dual) as basetype 
from meta m 
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 

Es funktioniert (gibt nur falsche Ergebnisse).

Wie kann ich entweder m.id in diesen Anfang mit, oder Refactoring dies zu arbeiten? Ich habe auch versucht, einige geschachtelte Selects zu verwenden und eine where-on-rownumber = 1-Reihenfolge nach Level-DESC zu machen, allerdings bekomme ich genau den gleichen Fehler, wenn ich versuche, auf m.id zu referenzieren.

Vielen Dank!

+0

Oracle9i Veröffentlichung 9.2.0.7.0 - 64-Bit-Produktion – Craig

+0

Ich bin nicht wirklich ein Experte auf diesem, aber was passiert, wenn Sie die nicht-Aliasing-Version zu verwenden versuchen? 'start with mb.id = meta.id' –

+0

Die nicht abgespeckte Version hat mehrere Joins zu meta, so dass dies nicht funktioniert. – Craig

Antwort

1

Können Sie diese Abfrage nicht zu den folgenden vereinfachen?

select m.id, m.name, 
(  select mb.name 
     from meta mb 
     where name in ('config_group', 'config_item') 
     start with mb.id = m.id 
     connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
) as basetype 
from meta m 
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 
+0

Wow, ich dachte, die Verbindung würde aufhören, wenn der Name nicht in einer der beiden ist, anstatt diese Zeile einfach zu ignorieren, aber weiterzumachen. Vielen Dank! – Craig

Verwandte Themen