Aggregate

此查詢的正確結果是什麼?

  • November 2, 2019

我在這裡的評論中遇到了這個難題

CREATE TABLE r (b INT);

SELECT 1 FROM r HAVING 1=1;

SQL ServerPostgreSQL返回 1 行。

MySQLOracle返回零行。

哪個是對的?或者兩者都同樣有效?

根據標準:

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 的定義)

  1. 如果沒有<where clause>指定,那麼讓T是前面的結果<from clause>;否則,讓T成為前面的結果<where clause>

  2. 案例:

a) 如果沒有分組列,則 的結果<group by clause>是分組表,包括T作為其唯一組。

因此我們可以得出結論

FROM r GROUP BY ()

產生一個分組表,由一組組成,有零行(因為 R 為空)。


7.12 通用規則的摘錄,它定義了一個查詢規範(又名 SELECT 語句):

  1. 案例:

a) 如果T不是分組表,則

$$ … $$ b) 如果T是一個分組表,那麼

案子:

i) 如果T有 0 個(零)組,則令 TEMP 為空表。

ii) 如果T有一個或多個組,則每個<value expression>組都應用於每個組,T從而產生一個行表TEMPM其中M是 中的組數T。TEMP的-th 列包含由-thi的評估得出的值。i``<value expression>

$$ … $$ 2) 案例:

a) 如果<set quantifier> DISTINCT未指定 ,則 的結果<query specification>TEMP

因此,由於表有一組,它必須有一個結果行。

因此

SELECT 1 FROM r HAVING 1=1

應該返回 1 行結果集。

量子點

引用自:https://dba.stackexchange.com/questions/33760