a subconsulta em FROM deve ter um alias


91

Tenho esta consulta que escrevi em PostgreSQL que retorna um erro dizendo:

[Err] ERROR:
LINE 3: FROM (SELECT DISTINCT (identifiant) AS made_only_recharge

Esta é a consulta completa:

SELECT COUNT (made_only_recharge) AS made_only_recharge
FROM (
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER = '0130'
    EXCEPT
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER != '0130'
)

Eu tenho uma consulta semelhante no Oracle que funciona bem. A única mudança é onde eu tenho EXCEPTno Oracle, eu substituí com a MINUSpalavra-chave. Eu sou novo no Postgres e não sei o que ele está pedindo. Qual é a maneira correta de lidar com isso?


3
Parece-me a exceção é desnecessário como a primeira cláusula onde já excepts TI: CALLEDNUMBER = '0130'.
Clodoaldo Neto

Este erro ainda acontece com Postgres 11 FWIW ...
rogerdpack

Respostas:


133

adicione um ALIASna subconsulta,

SELECT  COUNT(made_only_recharge) AS made_only_recharge
FROM    
    (
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER = '0130'
        EXCEPT
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER != '0130'
    ) AS derivedTable                           -- <<== HERE

18
@JohnWoo obrigado por isso, mas por que é necessário (acho que estou fazendo uma pergunta teórica aqui)?
Andrew Cassidy,

@AndrewCassidy Você deve definir isso para poder adicionar outras restrições à sua consulta (WHERE derivadoTabela. <atributo> = 5). caso contrário, seu banco de dados não saberá como se referir à subconsulta
stackhelper101

35
@AndrewCassidy É apenas uma sintaxe infeliz. Contanto que você não esteja se referindo a essa subconsulta, não importa qual seja o apelido. Pessoalmente, estou usando AS pg_sucks, significando "bem, aqui você tem algum identificador redundante, mas você poderia gerar algum internamente por você mesmo, maldito postgres!" :)
Tregoreg

1

No caso de tabelas aninhadas, alguns SGBD requerem o uso de um alias como MySQL e Oracle, mas outros não têm esse requisito estrito, mas ainda permitem adicioná-los para substituir o resultado da consulta interna.


1
Seu texto sugerem que há é tal exigência uma para Oracle e MySQL. Estou lendo certo?
Scratte

@Scratte Acho que você está certo e as palavras estão invertidas. "MySQL e Oracle, mas outros" deve ser "Postgresql, mas outros ssuch como MySQL e Oracle", eu acho. Claro que ainda é uma sentença contínua e pode ser melhorada. A resposta de 2013 está bem e esta resposta não acrescenta nada (comente sobre a resposta de 2013, se necessário), então esta última deve ser removida.
Expiação limitada de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.