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 HCdas sein <having clause>. Sei TEdas <table expression>, was sofort enthält HC. Wenn TEnicht sofort ein enthalten ist
<group by clause>, dann ist " GROUP BY ()" implizit. Sei Tder Deskriptor der Tabelle, die durch das <group by clause> GBCsofort enthaltene in definiert ist, TEund sei Rdas Ergebnis von GBC.
Ok, so viel ist ziemlich klar.
Behauptung: 1=1ist 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 Tdas Ergebnis des vorhergehenden <from clause>; Ansonsten sei Tdas Ergebnis des Vorhergehenden <where clause>.
2) Fall:
a) Wenn es keine Gruppierungsspalten gibt, ist das Ergebnis von <group by clause>die gruppierte Tabelle, die Tals 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 Tes sich nicht um eine gruppierte Tabelle handelt, dann [...]
b) Wenn Tes sich um eine gruppierte Tabelle handelt, dann
Fall:
i) Wenn Tes 0 (Null) Gruppen gibt, dann sei TEMP eine leere Tabelle.
ii) Wenn Teine oder mehr Gruppen, die jeweils dann <value expression>auf jede Gruppe angewandt wird , Twodurch man eine Tabelle TEMPvon MZeilen, wobei Mdie 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> DISTINCTnicht 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.