Понимание псевдонимов Oracle - почему псевдоним не распознается в запросе, если не заключен во второй запрос? - PullRequest
7 голосов
/ 27 мая 2011

У меня есть запрос


SELECT COUNT(*) AS "CNT",
       imei
FROM   devices  

, который выполняется просто отлично.Я хочу дополнительно ограничить запрос с помощью оператора WHERE.Следующим (по-человечески) логичным шагом является изменение запроса следующим образом:


SELECT COUNT(*) AS "CNT",
       imei
FROM   devices
WHERE  CNT > 1 

Однако это приводит к сообщению об ошибке ORA-00904: "CNT": неверный идентификатор .По какой-то причине перенос запроса в другой запрос дает желаемый результат:


SELECT *
FROM   (SELECT COUNT(*) AS "CNT",
               imei
        FROM   devices
        GROUP  BY imei)
WHERE  CNT > 1  

Почему Oracle не распознает псевдоним "CNT" во втором запросе?

Ответы [ 4 ]

13 голосов
/ 27 мая 2011

Поскольку в документации сказано, что не будет:

Укажите псевдоним для выражения столбца.Oracle Database будет использовать этот псевдоним в заголовке столбца набора результатов.Ключевое слово AS не является обязательным.Псевдоним эффективно переименовывает элемент списка выбора на время запроса.Псевдоним может использоваться в order_by_clause, но не в других предложениях в запросе.

Однако, когда у вас есть внутреннее выделение, это похоже на создание встроенного представления, в котором действуют псевдонимы столбцов, поэтомумогут использовать это на внешнем уровне.

8 голосов
/ 27 мая 2011

Простой ответ заключается в том, что предложение AS определяет, как будет вызван столбец в результате, который отличается от области самого запроса.

В вашем примере лучше всего подойдет предложение HAVING:

SELECT COUNT(*) AS "CNT",
       imei
FROM   devices
GROUP  BY imei
HAVING COUNT(*) > 1
4 голосов
/ 27 мая 2011

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

3 голосов
/ 21 августа 2014

Подводя итог, эта маленькая жемчужина объясняет:

10 простых шагов к полному пониманию SQL

Распространенным источником путаницы является простой фактчто элементы синтаксиса SQL не упорядочены по способу их выполнения.Лексический порядок:

SELECT [ DISTINCT ]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

Для простоты перечислены не все предложения SQL.Этот лексический порядок в корне отличается от логического порядка, то есть от порядка выполнения:

FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY

Как следствие, все, что вы пометите с помощью «AS», будет доступно только после того, как WHEREHAVING и GROUP BY уже выполнены.

...