la sous-requête dans FROM doit avoir un alias

91

J'ai cette requête que j'ai écrite dans PostgreSQL qui renvoie une erreur disant:

[Err] ERREUR:
LIGNE 3: FROM (SELECT DISTINCT (identifiant) AS made_only_recharge

Voici toute la requête:

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

J'ai une requête similaire dans Oracle qui fonctionne très bien. Le seul changement est là où j'ai EXCEPTdans Oracle je l'ai remplacé par le MINUSmot clé. Je suis nouveau sur Postgres et je ne sais pas ce qu'il demande. Quelle est la bonne façon de gérer cela?

roykasa
la source
3
Il me semble que l'exception n'est pas nécessaire que la première clause where déjà il excepte: CALLEDNUMBER = '0130'.
Clodoaldo Neto
Cette erreur se produit toujours avec Postgres 11 FWIW ...
rogerdpack

Réponses:

133

ajouter un ALIASsur la sous-requête,

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
John Woo
la source
18
@JohnWoo merci pour cela, mais pourquoi est-ce nécessaire (je suppose que je pose une question théorique ici)?
Andrew Cassidy
@AndrewCassidy Vous devez définir pour pouvoir ajouter des contraintes supplémentaires à votre requête (WHERE table dérivée. <attribute> = 5). sinon votre db ne saura pas comment se référer à la sous
stackhelper101
35
@AndrewCassidy C'est juste une syntaxe malchanceuse. Tant que vous ne faites pas référence à cette sous-requête, peu importe son alias. Personnellement, j'utilise AS pg_sucks, ce qui signifie "bien, ici vous avez un identifiant redondant, mais vous pourriez en générer en interne par vous-même, putain de postgres!" :)
Tregoreg
1

Dans le cas des tables imbriquées, certains SGBD nécessitent d'utiliser un alias comme MySQL et Oracle mais d'autres n'ont pas d'exigence aussi stricte, mais permettent tout de même de les ajouter pour remplacer le résultat de la requête interne.

Frank Cheng
la source
1
Votre libellé suggère qu'il existe une telle exigence pour Oracle et MySQL. Est-ce que je lis bien?
Scratte
@Scratte Je pense que vous avez raison et le libellé est inversé. "MySQL et Oracle mais d'autres" devraient être "Postgresql, mais d'autres ss tels que MySQL et Oracle" je pense. Bien sûr, c'est toujours une phrase récurrente et pourrait être encore améliorée. La réponse de 2013 est bonne et cette réponse n'ajoute rien (commentez la réponse de 2013 si vous devez le faire), donc cette dernière devrait être supprimée.
Expiation limitée