подзапрос в ОТ должен иметь псевдоним

#postgresql

Вопрос:

У меня есть этот запрос, который я написал в 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 и не знаю, о чем он просит. Как правильно с этим справиться?

Комментарии:

1. Мне кажется, что исключение не нужно, так как первое предложение where уже исключает его: CALLEDNUMBER = '0130' .

2. Эта ошибка все еще происходит с Postgres 11 FWIW…

Ответ №1:

Добавьте 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
 

Комментарии:

1. @JohnWoo спасибо за это, но зачем это нужно (наверное, я задаю здесь теоретический вопрос)?

2. @AndrewCassidy Вы должны определить, чтобы вы могли добавить дополнительные ограничения в свой запрос (ГДЕ выводится). <атрибут> = 5). в противном случае ваша база данных не будет знать, как ссылаться на подзапрос

3. @AndrewCassidy Это просто неудачный синтаксис. До тех пор, пока вы не ссылаетесь на этот подзапрос, не имеет значения, какой у него псевдоним. Лично я использую AS pg_sucks , что означает «ну , здесь у вас есть какой-то избыточный идентификатор, но вы могли бы сгенерировать его самостоятельно, черт возьми, postgres!» 🙂

4. @Tregoreg Мои псевдонимы всегда содержат какое-то ругательство с тем же эффектом.

Ответ №2:

В случае вложенных таблиц некоторые СУБД требуют использования псевдонимов, таких как MySQL и Oracle, но другие не имеют такого строгого требования, но все же позволяют добавлять их для замены результата внутреннего запроса.

Комментарии:

1. Ваша формулировка предполагает, что такое требование существует как для Oracle, так и для MySQL. Я правильно все понял?

2. @Scratte Я думаю, что вы правы, и формулировка изменилась. «MySQL и Oracle, но другие» должны быть «Postgresql, но другие, такие как MySQL и Oracle», я думаю. Конечно, это все еще продолжительное предложение, и его можно было бы еще улучшить. Ответ 2013 года в порядке, и этот ответ ничего не добавляет (прокомментируйте ответ 2013 года, если необходимо), поэтому последний следует удалить.

3. mysql действительно требует псевдонимов