Also, hier ist das Problem: Ich benutze XMLAGG, um Werte in einer Liste (um eine HTML-Tabelle in der Ausgabe zu generieren) mit einer Unterabfrage aufzurollen. Ohne XMLAGG gibt die Unterabfrage (wie erwartet) null Zeilen zurück, aber wenn ich den XMLAGG einschließe, wird eine Zeile zurückgegeben, obwohl das Ergebnis von XMLAGG Null ist. Gibt es eine systematische Möglichkeit, dies zu verhindern, oder muss ich das Ganze nur in eine case-Anweisung einfügen und die Ausführung von XMLAGG vermeiden, wenn es leer ist?Wie verhindere ich, dass XMLAGG eine Zeile in einer Unterabfrage erstellt, die keine Zeilen zurückgibt?
-Code sieht wie folgt aus:
SELECT 'stuff1' outerquery
, (SELECT TO_CLOB('some text')
|| xmlcast(xmlagg(xmlelement(E, 'text' || table2.data1 || ' text2' || table3.data1) ORDER BY table2.due_date) AS CLOB)
FROM table2
JOIN table3 ON table2.table3_id = table3.table3_id
WHERE [conditions]
) subquery
FROM table1
WHERE [conditions]
, wo die Bedingungen für die äußere Abfrage in einer Zeile führen und keine Zeilen für die innere Abfrage. Wenn ich das ausführe, wird der Teil "einige Text" in der Unterabfrage angezeigt, obwohl es keine Zeilen haben sollte, und es ist korrekt null, wenn ich das XMLAGG entferne, ohne die Bedingungen zu ändern.
Hat jemand dieses Problem schon einmal behandelt?
(Ich verwende XMLAGG statt LISTAGG, weil ich das Endergebnis gehen mehr als 4000 Zeichen erwarten)
Dies ist in einer Oracle-Datenbank.
Wenn Sie es zum Testen ausführen möchten, konnte ich dieses Verhalten nur anhand der Tabelle DUAL demonstrieren. Kommentieren Sie die XMLAGG-Zeile, um den Unterschied zu sehen.
SELECT 'stuff1' outerquery
, (SELECT TO_CLOB('some text')
|| xmlcast(xmlagg(xmlelement(E, 'text') ORDER BY 1) AS CLOB)
FROM DUAL
WHERE 1=2
) subquery
FROM DUAL
Das sind nützliche Informationen; Ich habe gerade getestet mit einer Gruppe von mit dem Dual-Beispiel, das ich eingerichtet habe und das scheint zu funktionieren. Ich habe eine Spalte, die ich für die Gruppierung in der echten Abfrage verwenden kann, ich dachte einfach nicht daran, das zu tun, da die Logik nicht ändert, alles zu bekommen oder nach dieser Spalte zu gruppieren. – ZeroK
Ich testete 'HAVING COUNT (*)> 0' und das scheint zu funktionieren –
@ WumpusQ.Wumbley. . . Gute Information. Ich habe die Antwort bearbeitet. –