Zu verstehen, wie Aggregatfunktionen arbeiten in SQL kritisch ist korrekt Abfragen zum Schreiben zurückkehren könnten. Wenn Sie einer Abfrage eine Aggregatfunktion (wie sum, avg, min, max, count) hinzufügen, bitten Sie die Datenbank, eine Gruppenoperation für eine Reihe von Ergebnissen durchzuführen. Die meisten Aggregate, wie min und max, geben null zurück, wenn sie mit einem leeren Satz von Zeilen zur Bearbeitung versehen sind. Die Ausnahme hiervon ist count() - it (korrekt) gibt 0 zurück, wenn eine leere Menge oder Zeilen angezeigt werden.
Diese Frage ergab sich aus der Analyse einer viel komplexeren Abfrage - eine mit mehreren Unterabfrageausdrücken in der SELECT-Klausel. Wie sich herausstellte, verursachte der Zusatz von count (*) im select-Ausdruck einige Schäden an den Ergebnissen - als es anfing, einen Wert zurückzuliefern, wo keiner erwartet wurde.
Was der Entwickler wirklich wollte, war ein Fall, in dem count(*)
null produzieren würde. Der einfachste Weg, dies zu erreichen, ist der Einsatz von Analytics in Oracle. Die Abfrage kann geschrieben werden, um die analytische Zählung äquivalent zu verwenden: count(*) over()
select 'abc ' || (select txt from
(select count(*) over(), 'xyz' as txt from dual where 1=2))
from dual
Absolut richtig ... dieses Problem kam in einer viel komplexeren Abfrage, wo es durch anderes Verhalten verdeckt wurde. Ich erkannte schließlich den Fehler - der ursprüngliche Entwickler musste wirklich count (*) over() verwenden - die analytische Funktion gibt NULL korrekt zurück - was der Entwickler in diesem Fall wirklich wollte. – LBushkin