Unterabfrage in FROM muss einen Alias ​​haben

91

Ich habe diese Abfrage, die ich in PostgreSQL geschrieben habe und die einen Fehler zurückgibt, der besagt:

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

Dies ist die ganze Abfrage:

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

Ich habe eine ähnliche Abfrage in Oracle, die gut funktioniert. Die einzige Änderung ist, wo ich EXCEPTin Oracle habe ich es durch das MINUSSchlüsselwort ersetzt. Ich bin neu bei Postgres und weiß nicht, wonach es verlangt. Wie geht man damit richtig um?

Roykasa
quelle
3
Es scheint mir, dass die Ausnahme unnötig ist, da die erste where-Klausel sie bereits ausschließt : CALLEDNUMBER = '0130'.
Clodoaldo Neto
Dieser Fehler tritt immer noch bei Postgres 11 FWIW auf ...
Rogerdpack

Antworten:

130

fügen Sie eine ALIASauf der Unterabfrage,

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
quelle
18
@ JohnWoo danke dafür, aber warum wird es benötigt (ich denke, ich stelle hier eine theoretische Frage)?
Andrew Cassidy
@AndrewCassidy Sie müssen definieren, damit Sie Ihrer Abfrage weitere Einschränkungen hinzufügen können (WHERE derivativeTable. <Attribut> = 5). Andernfalls weiß Ihre
Datenbank
34
@ AndrewCassidy Es ist nur eine unglückliche Syntax. Solange Sie nicht auf diese Unterabfrage verweisen, spielt es keine Rolle, um welchen Alias ​​es sich handelt. Persönlich verwende ich AS pg_sucks, was bedeutet "Nun, hier haben Sie eine redundante Kennung, aber Sie könnten einige intern selbst generieren, verdammte Postgres!" :)
Tregoreg
0

Bei verschachtelten Tabellen müssen einige DBMS einen Alias ​​wie MySQL und Oracle verwenden, andere haben keine so strengen Anforderungen, können sie jedoch hinzufügen, um das Ergebnis der inneren Abfrage zu ersetzen.

Frank Cheng
quelle
1
Ihre Formulierung vorschlagen , es ist eine solche Anforderung für Oracle und MySQL. Lese ich es richtig
Scratte
@Scratte Ich denke du hast recht und der Wortlaut ist umgedreht. "MySQL und Oracle, aber andere" sollte "Postgresql, aber andere wie MySQL und Oracle" sein, denke ich. Natürlich ist es immer noch ein Anlaufsatz und könnte weiter verbessert werden. Die Antwort von 2013 ist in Ordnung und diese Antwort fügt nichts hinzu (kommentieren Sie die Antwort von 2013, wenn Sie müssen), daher sollte letztere entfernt werden.
Eingeschränktes Sühnopfer