підзапит у FROM повинен мати псевдонім


91

У мене є цей запит, який я написав у PostgreSQL, який повертає повідомлення про помилку:

[Помилка] ПОМИЛКА:
РЯДОК 3: ВІД (ВИБЕРИТЕ ДИСТИНКТ (ідентифікатор) ЯК 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
Вона дивиться на мене виняток непотрібно , як перший , де становище вже excepts цього: CALLEDNUMBER = '0130'.
Clodoaldo Neto

Ця помилка все ще трапляється з Postgres 11 FWIW ...
rogerdpack

Відповіді:


134

додати 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 дякую за це, але навіщо це потрібно (мабуть, я тут задаю теоретичне питання)?
Ендрю Кассіді

1
@AndrewCassidy Ви повинні визначити, щоб ви могли додати додаткові обмеження до вашого запиту (WHERE derivaTable. <attribute> = 5). інакше ваш db не знатиме, як посилатися на підзапит
stackhelper101

36
@AndrewCassidy Це просто невдалий синтаксис. Поки ви не посилаєтесь на цей підзапит, неважливо, що це псевдонім. Особисто я використовую AS pg_sucks, маючи на увазі "ну, у вас є якийсь надлишковий ідентифікатор, але ви могли б створити його самостійно, блін postgres!" :)
Трегорег

1

У випадку вкладених таблиць деякі СУБД вимагають використання псевдонімів, таких як MySQL та Oracle, але інші не мають таких суворих вимог, але все одно дозволяють додавати їх, щоб замінити результат внутрішнього запиту.


1
Ваша формулювання запропонувати там є така вимога як для Oracle і MySQL. Чи правильно я читаю?
Скратт

@Scratte, я думаю, ти маєш рацію, і формулювання змінилось. "Я думаю, що" MySQL та Oracle, але інші "мають бути" Postgresql, але інші, такі як MySQL та Oracle ". Звичайно, це все ще запущене речення, і його можна ще вдосконалити. Відповідь 2013 року чудова, і ця відповідь нічого не додає (якщо потрібно, прокоментуйте відповідь 2013 року), тому останню слід видалити.
Обмежена викуп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.