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.