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

92

У меня есть этот запрос, который я написал в PostgreSQL, который возвращает ошибку:

[Err] ОШИБКА:
СТРОКА 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'.
Клодоальдо Нето
Эта ошибка все еще возникает с 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 производная таблица. <attribute> = 5). иначе ваша база данных не будет знать, как обращаться к подзапросу
stackhelper101
37
@AndrewCassidy Это просто неудачный синтаксис. Пока вы не ссылаетесь на этот подзапрос, не имеет значения, какой у него псевдоним. Лично я использую AS pg_sucks, что означает «ну, здесь у вас есть избыточный идентификатор, но вы можете сгенерировать его самостоятельно, черт побери, postgres!» :)
Tregoreg
1

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

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