4
respostas

Dúvida sub query

Bom dia, Escrevi o código da seguinte forma

SELECT nome
    FROM(

        SELECT     categoria.nome,
        COUNT (categoria.id)
        FROM curso
        JOIN categoria ON categoria.id  = curso.categoria_id

        GROUP BY 1
        ) AS teste
    WHERE categoria.id > 1;

mas ele não funciona, dá o seguinte erro:

ERROR: missing FROM-clause entry for table "categoria" LINE 11: WHERE categoria.id > 1; ^ SQL state: 42P01 Character: 174

no entanto, se eu trocar o "categoria.id" do WHERE para "COUNT", assim como no código abaixo, ele funciona

SELECT nome
    FROM(

        SELECT     categoria.nome,
        COUNT (categoria.id)
        FROM curso
        JOIN categoria ON categoria.id  = curso.categoria_id

        GROUP BY 1
        ) AS teste
    WHERE COUNT > 1;

Alguém pode me explicar o motivo disso? Não quero avançar no curso sem entender essa parte.

4 respostas

Ninguém? Site abandonado?

Olá Camila, tudo bem?

A Sub-consulta que você criou na sua consulta, é considerada a tabela onde você está buscando os dados, então para conseguir acessar os campos desta Sub-consulta, você precisa referenciar nos campos o alias que criou para ela.

Sub-consulta criada pela camila

Quando você executou a query, o Postgres entendeu que a tabela categoria informada no WHERE era a tabela onde ele deveria buscar os dados, porém, como você criou uma Sub-consulta, a busca deve ser realizada nela, ao informar diretamente o nome da tabela e do campo que está dentro da Sub-consulta sem referencia-la, ele não conseguiu localizar estas informações e retornou o erro.

Query da Camila

Então uma forma de resolver este problema, é criar um alias para o COUNT dentro da Sub-consulta e no WHERE que está fora, você informar o alias dado ao COUNT e o alias da Sub-consulta, desta forma:

Query da camila: foi criado o alias numero categoria para o count e no WHERE foi passado o nome  dado a sub_consulta e o alias do count

A sua query ficaria dessa forma:

SELECT nome
    FROM(
        SELECT     categoria.nome,
        COUNT (categoria.id) as numero_categoria
        FROM curso
        JOIN categoria ON categoria.id  = curso.categoria_id
        GROUP BY 1
        ) AS teste
    WHERE teste.numero_categoria > 1

Espero ter ajudado, qualquer nova dúvida é só falar e bons estudos!

Boa noite,

E qual seria a explicação de usar somente o "COUNT" funcionar, no exemplo do segundo código?

A segunda query funcionou pois o COUNT é um função independente, que não depende diretamente da tabela. Neste caso da query, é como se o COUNT externo, estivesse realizando uma contagem do resultado retornado da subquery.