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> )
Copy

Onde:

comparisonOperator ::=
  { = | != | > | >= | < | <= }
Copy

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);
Copy

[ 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> )
Copy

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);
Copy

[ 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> )
Copy

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);
Copy