Como trabalhar com subconsultas¶
Uma subconsulta é uma consulta dentro de outra consulta. Subconsultas em uma cláusula FROM ou WHERE são usadas para fornecer dados que serão usados para limitar ou comparar/avaliar os dados retornados pela consulta que as contém.
Neste tópico:
Tipos de subconsultas¶
Subconsultas escalares vs. não escalares¶
Subconsultas também podem ser categorizadas como escalares ou não escalares:
Uma subconsulta escalar retorna um único valor (uma coluna de uma linha). Se nenhuma linha se qualificar para ser retornada, a subconsulta retorna NULL.
Uma subconsulta não escalar retorna 0, 1 ou múltiplas linhas, cada uma das quais pode conter 1 ou múltiplas colunas. Para cada coluna, se não houver valor a retornar, a subconsulta retorna NULL. Se nenhuma linha se qualificar para ser retornada, a subconsulta retorna 0 linhas (não NULLs).
Tipos com suporte pelo Snowflake¶
O Snowflake atualmente suporta os seguintes tipos de subconsultas:
Operadores de subconsulta¶
Operadores de subconsultas operam em expressões de consulta aninhadas. Eles podem ser usados para calcular valores que são:
Subconsultas escalares¶
Uma subconsulta escalar é uma subconsulta que retorna no máximo uma linha. Uma subconsulta escalar pode aparecer em qualquer lugar em que uma expressão de valor possa aparecer, incluindo a lista SELECT, a cláusula GROUP BY ou um argumento para uma função em uma cláusula WHERE ou HAVING.
Notas de uso¶
Uma subconsulta escalar pode conter apenas um item na lista SELECT.
Se uma subconsulta escalar retorna mais de uma linha, um erro de tempo de execução é gerado.
As subconsultas escalares relacionadas são atualmente com suporte somente se puderem ser determinadas estaticamente para retornar uma linha (por exemplo, se a lista SELECT contiver uma função agregada sem GROUP BY).
Subconsultas escalares não correlacionadas têm suporte em qualquer lugar em que uma expressão de valor seja permitida.
Subconsultas com uma correlação dentro de FLATTEN não são atualmente com suporte.
A cláusula LIMIT / FETCH é permitida somente em subconsultas escalares não correlacionadas.
Exemplos¶
Este exemplo mostra uma subconsulta básica não correlacionada em uma cláusula WHERE:
SELECT employee_id FROM employees WHERE salary = (SELECT max(salary) FROM employees);
Este exemplo mostra uma subconsulta não correlacionada em uma cláusula FROM; esta subconsulta básica retorna um subconjunto das informações na tabela international_GDP
. A consulta geral lista empregos em países de “salários altos” onde a remuneração anual do emprego é a mesma que per_capita_GDP naquele país.
SELECT p.name, p.annual_wage, p.country FROM pay AS p INNER JOIN (SELECT name, per_capita_GDP FROM international_GDP WHERE per_capita_GDP >= 10000.0) AS pcg ON pcg.per_capita_GDP = p.annual_wage AND p.country = pcg.name;
Limitações¶
Embora as subconsultas possam conter uma ampla gama de instruções SELECT, elas têm as seguintes limitações:
Algumas cláusulas não são permitidas dentro das subconsultas ANY/ALL/NOT EXISTS.
O único tipo de subconsulta que permite uma cláusula LIMIT / FETCH é uma subconsulta escalar não correlacionada. Além disso, como uma subconsulta escalar não correlacionada retorna apenas 1 linha, a cláusula LIMIT tem pouco ou nenhum valor prático dentro de uma subconsulta.