FROMのサブクエリにはエイリアスが必要です


91

私はPostgreSQLで作成したこのクエリがあります。

[エラー]エラー:
3行目:FROM(SELECT DISTINCT(identifiant)AS AS made_only_recharge

これはクエリ全体です:

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

Oracleで同様に機能するクエリが正常に機能しています。唯一の変更はEXCEPT、OracleのどこにあるかMINUSということですが、それをキーワードに置き換えました。私はPostgresを使い始めたばかりで、何を求めているのかわかりません。これを処理する正しい方法は何ですか?


3
最初のwhere句はすでにそれを除外しているので、例外は不要CALLEDNUMBER = '0130'です:。
Clodoaldo Neto 2013

このエラーはPostgres 11 FWIWでも発生します...
rogerdpack '18

回答:


133

ALIASサブクエリにを追加し、

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これに感謝しますが、なぜそれが必要なのですか(私はここで理論的な質問をしていると思います)?
Andrew Cassidy

@AndrewCassidyクエリにさらに制約を追加できるように定義する必要があります(WHEREderivedTable。<attribute> = 5)。そうしないと、dbはサブクエリを参照する方法がわかりません
stackhelper101

35
@AndrewCassidyこれは不運な構文です。そのサブクエリを参照していない限り、エイリアスが何であるかは問題ではありません。個人的に、私はを使用してAS pg_sucksいます。「まあ、ここには冗長な識別子がありますが、内部で生成することもできますよ、postgres!」:)
Tregoreg、2015

1

ネストされたテーブルの場合、一部のDBMSはMySQLやOracleのようなエイリアスを使用する必要がありますが、他のDBMSはそのような厳密な要件はありませんが、それらを追加して内部クエリの結果を置き換えることができます。


1
あなたの言葉遣いが示唆され、OracleとMySQLの両方のために、このようなA要件は。私はそれを正しく読んでいますか?
スクラッチ

@Scratte私はあなたが正しいと思います、そして言い回しは好転しています。「MySQLとOracle以外」は「Postgresqlですが、MySQLやOracleなどの他のs」と思います。もちろん、それはまだ実行中の文であり、さらに改善される可能性があります。2013年の回答は問題なく、この回答は何も追加しないため(必要に応じて2013年の回答にコメントを付ける)、後者を削除する必要があります。
制限付きの贖罪
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.