표준에 따라 :
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
하고 LET 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 그룹의 그룹화 된 테이블입니다
.
논리 : 검색 조건이 항상 참이므로 결과는 R
식에 의한 그룹의 결과 인입니다.
다음은 일반 규칙 7.9에서 발췌 한 것입니다 (GROUP BY CLAUSE 정의).
1) no <where clause>
가 지정되면 T
앞의 결과가된다 <from clause>
. 그렇지 않으면 T
앞의 결과를 보자 <where clause>
.
2) 사례 :
a) 그룹화 열이 없으면 결과 는 유일한 그룹 <group by clause>
으로 구성된 그룹화 된 테이블 T
입니다.
따라서 우리는 결론을 내릴 수 있습니다
FROM r GROUP BY ()
행이 0 인 한 그룹으로 구성된 그룹화 된 테이블이됩니다 (R이 비어 있으므로).
쿼리 규정 (일명 SELECT 문)을 정의하는 7.12의 일반 규칙에서 발췌 한 내용 :
1) 사례 :
a) T
그룹화 된 테이블이 아닌 경우 [...]
b) T
그룹화 된 테이블 인 경우
케이스:
i) T
그룹이 0 인 경우 TEMP를 빈 테이블로 둡니다.
ii) T
하나 이상의 그룹이있는 경우 <value expression>
각 그룹 은 행 그룹을 T
생성하는 각 그룹에 적용됩니다 . 여기서 그룹의 수는입니다 . TEMP의 번째 열은의 평가에 의해 도출 된 값을 포함 번째를 . [...]TEMP
M
M
T
i
i
<value expression>
2) 사례 :
a)를 <set quantifier>
DISTINCT
지정하지 않으면의 결과는 <query specification>
입니다 TEMP
.
따라서 테이블에는 하나의 그룹이 있으므로 하나의 결과 행이 있어야합니다.
그러므로
SELECT 1 FROM r HAVING 1=1
1 행 결과 집합을 반환해야합니다.
QED
SELECT COUNT(*) FROM r;
1 행 (with0
)을SELECT COUNT(*) FROM r GROUP BY ();
반환하지만 행은 반환하지 않기 때문에 모순됩니다 .