此查詢的正確結果是什麼?
我在這裡的評論中遇到了這個難題
CREATE TABLE r (b INT); SELECT 1 FROM r HAVING 1=1;
SQL Server和PostgreSQL返回 1 行。
哪個是對的?或者兩者都同樣有效?
根據標準:
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
不立即包含 a<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>
邏輯:由於搜尋條件始終為真,結果為
R
,即group by表達式的結果。以下是 7.9 通則的節選(GROUP BY CLAUSE 的定義)
如果沒有
<where clause>
指定,那麼讓T
是前面的結果<from clause>
;否則,讓T
成為前面的結果<where clause>
。案例:
a) 如果沒有分組列,則 的結果
<group by clause>
是分組表,包括T
作為其唯一組。因此我們可以得出結論
FROM r GROUP BY ()
產生一個分組表,由一組組成,有零行(因為 R 為空)。
7.12 通用規則的摘錄,它定義了一個查詢規範(又名 SELECT 語句):
- 案例:
a) 如果
T
不是分組表,則$$ … $$ b) 如果
T
是一個分組表,那麼案子:
i) 如果
T
有 0 個(零)組,則令 TEMP 為空表。ii) 如果
T
有一個或多個組,則每個<value expression>
組都應用於每個組,T
從而產生一個行表TEMP
,M
其中M
是 中的組數T
。TEMP的-th 列包含由-thi
的評估得出的值。i``<value expression>
$$ … $$ 2) 案例:
a) 如果
<set quantifier>
DISTINCT
未指定 ,則 的結果<query specification>
為TEMP
。因此,由於表有一組,它必須有一個結果行。
因此
SELECT 1 FROM r HAVING 1=1
應該返回 1 行結果集。
量子點