Nach dem Standard:
SELECT 1 FROM r HAVING 1=1
meint
SELECT 1 FROM r GROUP BY () HAVING 1=1
Zitat ISO / IEC 9075-2: 2011 7.10 Syntaxregel 1 (Teil der Definition der HAVING-Klausel):
Lass HC
das sein <having clause>
. Sei TE
das <table expression>
, was sofort enthält HC
. Wenn TE
nicht sofort ein enthalten ist
<group by clause>
, dann ist " GROUP BY ()
" implizit. Sei T
der Deskriptor der Tabelle, die durch das <group by clause>
GBC
sofort enthaltene in definiert ist, TE
und sei R
das Ergebnis von GBC
.
Ok, so viel ist ziemlich klar.
Behauptung: 1=1
ist wahre Suchbedingung. Ich werde dafür kein Zitat geben.
Jetzt
SELECT 1 FROM r GROUP BY () HAVING 1=1
ist gleichwertig mit
SELECT 1 FROM r GROUP BY ()
Zitat ISO / IEC 9075-2: 2011 7.10 Allgemeine Regel 1:
Das <search condition>
wird für jede Gruppe von ausgewertet R
. Das Ergebnis von <having clause>
ist eine gruppierte Tabelle der Gruppen von R, für die das Ergebnis von
<search condition>
True ist.
Logik: Da die Suchbedingung immer wahr ist R
, ist das Ergebnis das Ergebnis der Gruppierung nach Ausdrücken.
Das Folgende ist ein Auszug aus den Allgemeinen Regeln von 7.9 (die Definition der GROUP BY CLAUSE)
1) Wenn nein <where clause>
angegeben ist, sei T
das Ergebnis des vorhergehenden <from clause>
; Ansonsten sei T
das Ergebnis des Vorhergehenden <where clause>
.
2) Fall:
a) Wenn es keine Gruppierungsspalten gibt, ist das Ergebnis von <group by clause>
die gruppierte Tabelle, die T
als einzige Gruppe besteht.
Daraus können wir schließen
FROM r GROUP BY ()
ergibt eine gruppierte Tabelle, bestehend aus einer Gruppe, mit null Zeilen (da R leer ist).
Ein Auszug aus den Allgemeinen Regeln von 7.12, in dem eine Abfragespezifikation (auch als SELECT-Anweisung bezeichnet) definiert ist:
1) Fall:
a) Wenn T
es sich nicht um eine gruppierte Tabelle handelt, dann [...]
b) Wenn T
es sich um eine gruppierte Tabelle handelt, dann
Fall:
i) Wenn T
es 0 (Null) Gruppen gibt, dann sei TEMP eine leere Tabelle.
ii) Wenn T
eine oder mehr Gruppen, die jeweils dann <value expression>
auf jede Gruppe angewandt wird , T
wodurch man eine Tabelle TEMP
von M
Zeilen, wobei M
die Anzahl der Gruppen in T
. Die i
-te Spalte von TEMP enthält die Werte, die durch die Auswertung der i
-ten abgeleitet wurden <value expression>
. [...]
2) Fall:
a) Wenn das <set quantifier>
DISTINCT
nicht angegeben wird, dann ist das Ergebnis der <query specification>
ist TEMP
.
Da die Tabelle eine Gruppe enthält, muss sie daher eine Ergebniszeile enthalten.
Somit
SELECT 1 FROM r HAVING 1=1
sollte eine 1-zeilige Ergebnismenge zurückgeben.
QED
SELECT COUNT(*) FROM r;
1 Zeile (mit0
) zurückgegeben wird, währendSELECT COUNT(*) FROM r GROUP BY ();
keine Zeilen zurückgegeben werden.