標準ごと:
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)T1つ以上のグループがある場合<value expression>、各グループに適用され、行のTテーブルTEMPを生成します。MここでMはのグループ数ですT。iTEMP の-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 ();返し、行を返さないため、矛盾しています。