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?


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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.