podzapytanie w FROM musi mieć alias

91

Mam takie zapytanie, które napisałem w PostgreSQL, które zwraca błąd:

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

To jest całe zapytanie:

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

Mam podobne zapytanie w Oracle, które działa dobrze. Jedyną zmianą jest to, że mam EXCEPTw Oracle, które zastąpiłem MINUSsłowem kluczowym. Jestem nowy w Postgres i nie wiem, o co prosi. Jaki jest właściwy sposób radzenia sobie z tym?

roykasa
źródło
3
Wydaje mi wyjątkiem jest niepotrzebny, jako pierwszy, gdy klauzula już EXCEPTS IT: CALLEDNUMBER = '0130'.
Clodoaldo Neto
Ten błąd nadal występuje z Postgres 11 FWIW ...
rogerdpack

Odpowiedzi:

134

dodaj ALIASdo podzapytania,

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
źródło
18
@JohnWoo dzięki za to, ale dlaczego jest to potrzebne (chyba zadaję tutaj pytanie teoretyczne)?
Andrew Cassidy
1
@AndrewCassidy Musisz zdefiniować, aby móc dodawać dalsze ograniczenia do zapytania (WHERE wywodząca tabela. <atrybut> = 5). inaczej twój db nie będzie wiedział, jak odnieść się do podzapytania
stackhelper101
37
@AndrewCassidy To po prostu pechowa składnia. Dopóki nie odwołujesz się do tego podzapytania, nie ma znaczenia, jaki to alias. Osobiście używam AS pg_sucks, co oznacza "cóż, tutaj masz jakiś nadmiarowy identyfikator, ale możesz sam wygenerować trochę wewnętrznie, cholera postgres!" :)
Tregoreg
1

W przypadku tabel zagnieżdżonych niektóre DBMS wymagają użycia aliasów, takich jak MySQL i Oracle, ale inne nie mają tak ścisłego wymogu, ale nadal pozwalają na ich dodanie, aby zastąpić wynik zapytania wewnętrznego.

Frank Cheng
źródło
1
Twój sformułowania sugerują, że jest taki wymóg zarówno dla Oracle i MySQL. Czy dobrze to czytam?
Scratte
@Scratte Myślę, że masz rację i sformułowanie zostało zmienione. „MySQL i Oracle, ale inne” powinno brzmieć „Postgresql, ale inne, takie jak MySQL i Oracle”, jak sądzę. Oczywiście jest to nadal zdanie kontynuowane i można je jeszcze ulepszyć. Odpowiedź z 2013 r. Jest w porządku, a ta odpowiedź nic nie dodaje (skomentuj odpowiedź z 2013 r., Jeśli musisz), więc tę ostatnią należy usunąć.
Limited Atonement