Operadores de subconsulta¶
Uma subconsulta é uma consulta dentro de outra consulta. Os operadores de subconsulta executam operações nos valores produzidos pelas subconsultas.
O Snowflake oferece suporte aos seguintes operadores de subconsulta:
ALL / ANY¶
As palavras-chave ALL e ANY podem ser usadas para aplicar um operador de comparação aos valores produzidos por uma subconsulta (que pode retornar mais de uma linha).
Sintaxe¶
<expr> comparisonOperator { ALL | ANY } ( <query> )
Onde:
comparisonOperator ::=
{ = | != | > | >= | < | <= }
Notas de uso¶
A expressão é comparada com o operador para cada valor que a subconsulta retorna:
Se ALL for especificado, o resultado é TRUE se todas as linhas da subconsulta satisfazem a condição; caso contrário, retorna FALSE.
Se ANY for especificado, o resultado é TRUE se qualquer linha da subconsulta satisfaz a condição; caso contrário, retorna FALSE.
Subconsultas ANY / ALL são atualmente aceitas apenas em uma cláusula WHERE.
Subconsultas ANY/ALL não podem aparecer como argumento de um operador OR.
A subconsulta deve conter apenas um item em sua lista SELECT.
Exemplos¶
Use uma subconsulta != ALL
para encontrar os departamentos que não têm funcionários:
SELECT department_id
FROM departments d
WHERE d.department_id != ALL (
SELECT e.department_id
FROM employees e);
[ NOT ] EXISTS¶
Uma subconsulta EXISTS é uma expressão booliana que pode aparecer em uma cláusula WHERE ou HAVING, ou em qualquer função que opere em uma expressão booliana:
Uma expressão EXISTS avalia como TRUE se alguma linha é produzida pela subconsulta.
Uma expressão NOT EXISTS avalia como TRUE se nenhuma linha é produzida pela subconsulta.
Sintaxe¶
[ NOT ] EXISTS ( <query> )
Notas de uso¶
Subconsultas EXISTS correlacionadas são atualmente aceitas apenas em uma cláusula WHERE.
Subconsultas EXISTS correlacionadas não podem aparecer como um argumento para um operador OR.
Subconsultas EXISTS não correlacionadas são aceitas em qualquer lugar em que uma expressão booliana é permitida.
Exemplos¶
Use uma subconsulta NOT EXISTS correlacionada para encontrar os departamentos que não têm funcionários:
SELECT department_id
FROM departments d
WHERE NOT EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.department_id);
[ NOT ] IN¶
Os operadores IN e NOT IN verificam se uma expressão está inclusa nos valores produzidos por uma subconsulta.
Sintaxe¶
<expr> [ NOT ] IN ( <query> )
Notas de uso¶
IN é a abreviatura de
= ANY
e está sujeita às mesmas restrições que as subconsultas ANY.NOT IN é a abreviatura de
!= ALL
e está sujeita às mesmas restrições que as subconsultas ALL.[NOT] IN também pode ser usado como um operador em expressões que não envolvam uma subconsulta. Para obter mais detalhes, consulte [ NOT ] IN.
Exemplos¶
Use uma subconsulta NOT IN que seja equivalente ao exemplo de subconsulta != ALL
(anteriormente neste tópico) para encontrar os departamentos que não têm funcionários:
SELECT department_id
FROM departments d
WHERE d.department_id NOT IN (
SELECT e.department_id
FROM employees e);