9 Stimmen

Verschachtelte SQL-Unterabfrage, die auf die Spalte "Großeltern" verweist

Ich habe eine besonders komplizierte Abfrage für einen Bericht. Sie wählt mehrere Spalten aus einer Ansicht aus und muss eine Spalte durch aggregierte Verkettung mehrerer Felder erstellen. Um die Dinge weiter zu verkomplizieren, muss die Verkettung 3 Felder enthalten, auch wenn es in Wirklichkeit 0 sind (Die Verkettung ist durch Kommata getrennt, so dass leere Felder noch bemerkt werden).

Wir verwenden Oracle 11.1.0.7.0.

Um die Abwärtskompatibilität zu gewährleisten (was nicht notwendig ist), haben wir die Funktion xmlagg für die Verkettung verwendet, die es meines Wissens seit Oracle 8 oder 9 gibt.

Dieses Beispiel ist zwar vereinfacht, aber ich denke, dass es genügend Informationen liefert. Mit anderen Worten: Bitte konzentrieren Sie sich nicht auf die Normalisierung der Tabellenstruktur, dies ist lediglich ein Beispiel.

person_view
-----------
name
phone
address
position_id

position_table
--------------
position_id
position_title

Die Abfrage, die wir derzeit haben, und ich gebe zu, dass ich kein SQL-Guru bin, lautet etwa so:

select
  name,
  phone,
  address,
  (select
     xmlagg(xmlelement(e, position_title || ',')).extract('//text()')
   from
     (select
        position_title
      from
        position_table
      where
        position_table.position_id = person_view.position_id and 
        rownum <= 3
      union all select '' from dual
      union all select '' from dual
      union all select '' from dual
     )
   where
     rownum <= 3
  )
from
  person_view

Mein eigentlicher Fehler ist, dass anscheinend die Unterabfrage, die mindestens 3 Eingabezeilen sicherstellt, nicht auf die Abfrage der Großeltern verweisen kann, um person_view.position_id zu bestimmen.

Ich erhalte ORA-00904: "PERSON_VIEW". "POSITION_ID": ungültiger Bezeichner

Die Leistung ist kein großes Problem, da es sich um einen Bericht handelt, der nicht regelmäßig ausgeführt wird, aber ich muss eine Lösung finden, um diese Daten mit absolut 3 Datenspalten zu aggregieren. Jede Anleitung zum Umschreiben der Abfrage oder zum Zugriff der Unterabfrage auf die entsprechende Großelternspalte wird sehr geschätzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X