標準ごと:
SELECT 1 FROM r HAVING 1=1
手段
SELECT 1 FROM r GROUP BY () HAVING 1=1
引用ISO / IEC 9075-2:2011 7.10構文規則1(HAVING句の定義の一部):
してみましょうHC
こと<having clause>
。してみましょうTE
ことが<table expression>
すぐに含まれていますHC
。TE
がすぐに含まれない
場合<group by clause>
、「GROUP BY ()
」は暗黙的です。ましょうT
で定義されたテーブルの記述子<group by clause>
GBC
すぐに含まれるTE
とましょうR
の結果GBC
。
わかりましたので、それはかなり明確です。
アサーション:1=1
は真の検索条件です。これについては引用しません。
いま
SELECT 1 FROM r GROUP BY () HAVING 1=1
に等しい
SELECT 1 FROM r GROUP BY ()
引用ISO / IEC 9075-2:2011 7.10一般規則1:
<search condition>
のグループごとに評価されますR
。の結果は、<having clause>
Rのグループのグループ化されたテーブルであり、その結果
<search condition>
はTrueです。
ロジック:検索条件は常に真であるため、結果はR
であり、これはgroup by式の結果です。
以下は、7.9の一般規則(GROUP BY CLAUSEの定義)からの抜粋です。
1)no <where clause>
が指定されている場合、let T
は前の結果になり<from clause>
ます; それ以外の場合T
は、先行の結果とし<where clause>
ます。
2)ケース:
a)グループ化列がない場合、の結果は、唯一のグループとして<group by clause>
構成されるグループ化されたテーブルT
です。
したがって、我々はそれを結論付けることができます
FROM r GROUP BY ()
1行のグループで構成されるグループ化されたテーブルになり、行はゼロになります(Rは空なので)。
クエリ仕様(別名SELECTステートメント)を定義する7.12の一般規則からの抜粋:
1)ケース:
a)T
グループ化されたテーブルでない場合、[...]
b)T
グループ化されたテーブルの場合、
場合:
i)T
グループが0(ゼロ)の場合、TEMPを空のテーブルにします。
ii)T
1つ以上のグループがある場合<value expression>
、各グループに適用され、行のT
テーブルTEMP
を生成します。M
ここでM
はのグループ数ですT
。i
TEMP の-th列には、i
-thの評価によって導出された値が含まれます<value expression>
。[...]
2)ケース:
a)<set quantifier>
DISTINCT
が指定されていない場合、の結果は<query specification>
ですTEMP
。
したがって、テーブルには1つのグループがあるため、1つの結果行が必要です。
かくして
SELECT 1 FROM r HAVING 1=1
1行の結果セットを返す必要があります。
QED
SELECT COUNT(*) FROM r;
1行(を含む0
)をSELECT COUNT(*) FROM r GROUP BY ();
返し、行を返さないため、矛盾しています。