subquery di FROM harus memiliki alias

92

Saya memiliki kueri ini yang saya tulis di PostgreSQL yang mengembalikan kesalahan yang mengatakan:

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

Ini adalah keseluruhan pertanyaan:

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

Saya memiliki pertanyaan serupa di Oracle yang berfungsi dengan baik. Satu-satunya perubahan adalah yang saya miliki EXCEPTdi Oracle, saya telah menggantinya dengan MINUSkata kunci. Saya baru mengenal Postgres dan tidak tahu apa yang diminta. Bagaimana cara yang benar untuk menangani ini?

roykasa
sumber
3
Ini terlihat dengan saya pengecualian tidak perlu sebagai yang pertama di mana klausul sudah excepts itu: CALLEDNUMBER = '0130'.
Clodoaldo Neto
Kesalahan ini masih terjadi dengan Postgres 11 FWIW ...
rogerdpack

Jawaban:

134

tambahkan ALIASdi subkueri,

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
sumber
18
@JohnWoo terima kasih untuk ini, tetapi mengapa itu diperlukan (saya kira saya mengajukan pertanyaan teori di sini)?
Andrew Cassidy
1
@AndrewCassidy Anda harus mendefinisikan sehingga Anda dapat menambahkan batasan lebih lanjut pada kueri Anda (WHERE derivableTable. <attribute> = 5). jika tidak, db Anda tidak akan tahu cara merujuk ke subquery
stackhelper101
37
@AndrewCassidy Itu hanya sintaks sial. Selama Anda tidak merujuk ke subkueri itu, tidak peduli apa aliasnya. Secara pribadi, saya menggunakan AS pg_sucks, yang berarti "baik, di sini Anda memiliki beberapa pengenal yang berlebihan, tetapi Anda dapat membuat beberapa secara internal sendiri, postgres sialan!" :)
Tregoreg
1

Dalam kasus tabel bersarang, beberapa DBMS perlu menggunakan alias seperti MySQL dan Oracle tetapi yang lain tidak memiliki persyaratan yang ketat, tetapi masih memungkinkan untuk menambahkannya untuk menggantikan hasil kueri dalam.

Frank Cheng
sumber
1
Kata-kata Anda menyarankan ada adalah persyaratan tersebut untuk kedua Oracle dan MySQL. Apakah saya membacanya dengan benar?
Scratte
@Scratte Saya pikir Anda benar dan kata-katanya berbalik. "MySQL dan Oracle tetapi yang lain" harus "Postgresql, tetapi sseperti MySQL dan Oracle" menurut saya. Tentu saja itu masih merupakan kalimat pelarian, dan bisa lebih ditingkatkan. Jawaban 2013 baik-baik saja dan jawaban ini tidak menambahkan apa-apa (komentari jawaban 2013 jika Anda harus), jadi yang terakhir harus dihapus.
Penebusan Terbatas