la subconsulta en FROM debe tener un alias

92

Tengo esta consulta que he escrito en PostgreSQL que devuelve un error que dice:

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

Esta es la 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'
)

Tengo una consulta similar en Oracle que funciona bien. El único cambio es donde tengo EXCEPTen Oracle lo he reemplazado con la MINUSpalabra clave. Soy nuevo en Postgres y no sé lo que está pidiendo. ¿Cuál es la forma correcta de manejar esto?

Roykasa
fuente
3
A mi me parece la excepción es innecesario, ya que la primera cláusula where ya se exceptúa de TI: CALLEDNUMBER = '0130'.
Clodoaldo Neto
Este error todavía ocurre con Postgres 11 FWIW ...
rogerdpack

Respuestas:

134

agregue un ALIASen la 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
John Woo
fuente
18
@JohnWoo gracias por esto, pero ¿por qué es necesario (supongo que estoy haciendo una pregunta teórica aquí)?
Andrew Cassidy
1
@AndrewCassidy Tiene que definir para que pueda agregar más restricciones a su consulta (DONDE tabla derivada. <Atributo> = 5). de lo contrario, su db no sabrá cómo hacer referencia a la subconsulta
stackhelper101
37
@AndrewCassidy Es una sintaxis de mala suerte. Siempre que no esté haciendo referencia a esa subconsulta, no importa cuál sea su alias. Personalmente, estoy usando AS pg_sucks, que significa "bueno, aquí tienes un identificador redundante, pero podrías generar algunos internamente tú mismo, ¡maldito postgres!" :)
Tregoreg
1

En el caso de tablas anidadas, algunos DBMS requieren usar un alias como MySQL y Oracle, pero otros no tienen un requisito tan estricto, pero aún permiten agregarlos para sustituir el resultado de la consulta interna.

Frank Cheng
fuente
1
Su redacción sugieren que existe es tal requisito para Oracle y MySQL. ¿Lo estoy leyendo bien?
Scratte
@Scratte Creo que tienes razón y la redacción está cambiada. "MySQL y Oracle pero otros" debería ser "Postgresql, pero otros como MySQL y Oracle", creo. Por supuesto, sigue siendo una sentencia extendida y podría mejorarse aún más. La respuesta de 2013 está bien y esta respuesta no agrega nada (comente sobre la respuesta de 2013 si es necesario), por lo que esta última debe eliminarse.
Expiación limitada