Microsoft obecnie zezwala na tę składnię.
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT *
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) > 1
);
Zauważ, że nie ma GROUP BY
w tej EXISTS
klauzuli, czy jest to poprawny ANSI SQL. A może po prostu ujawnia szczegół implementacji.
Dla porównania, ta sama składnia nie jest dozwolona w PostgreSQL.
BŁĄD: kolumna „tx” musi pojawić się w klauzuli GROUP BY lub być użyta w funkcji agregującej
Ale ta składnia jest dozwolona.
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT 1 -- This changed from the first query
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) > 1
);
I ta składnia jest dozwolona.
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT *
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
GROUP BY t.x -- This changed from the first query
HAVING count(*) > 1
);
Pytanie powstaje w wyniku rozmowy z @ErikE na czacie
źródło