ROWNUM возвращается как "неверный идентификатор"

Я запускаю очень простой выбор для базы данных Oracle (не уверен в версии).

SELECT * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE

Я хочу вернуть только самую последнюю запись. Итак, я попытался...

SELECT ROWNUM, * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE
SELECT * FROM ACCOUNTING WHERE ID = 123456 AND ROWNUM < 2 ORDER BY DATE

Я получаю один и тот же результат каждый раз...

Error Source: System.Data.OracleClient    
Error Message: ORA-00904: "ROWNUM" : invalid identifier

Все, что я вижу и читаю, говорит о том, что это должно работать. Кто-нибудь может увидеть, что мне не хватает? Может ли это быть проблемой с драйвером? Я использую следующий пакет... (Oracle ODAC 11.20.30 x64)

ОБНОВИТЬ

Спасибо за все ваши ответы... Я прошу прощения за любую путаницу, которую я создал в моих усилиях по упрощению сценария. Драйвер ODAC фактически разбивает запрос и форматирует его для меня, поэтому то, что я первоначально разместил, не является точно выполняемым запросом... вот, в частности, что выдает драйвер, который генерирует ошибку...

SELECT "ROWNUM", ID, SITE_ID, READING_DATE, SUBMITTED_DATE, DEPOSIT_DATE
FROM    ACCOUNTING
WHERE   (SITE_ID = 33730)
ORDER BY READING_DATE

И для моей второй попытки...

SELECT ID, SITE_ID, READING_DATE, SUBMITTED_DATE, DEPOSIT_DATE
FROM    ACCOUNTING
WHERE   (SITE_ID = 33730) AND ("ROWNUM" < 2)
ORDER BY READING_DATE

4 ответа

Решение

Ваш фактический запрос может использовать ROWNUM в двойных кавычках. В противном случае эта ошибка невозможна.

Хотя ваш первый запрос будет ORA-00936: missing expression

select * from dual WHERE "ROWNUM" < =3;

Error report -
SQL Error: ORA-00904: "ROWNUM": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

ROWNUM это псевдо-столбец, и это как функция без параметров.. и, кстати "ROWNUM" заставляет оракула искать такой столбец в вашей таблице..

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

Не уверен, как остановить построитель запросов для интерпретации этого способа. Я бы посчитал это БАГОМ.

Можно попробовать этот подход:

SELECT * FROM 
   (SELECT ROWNUM R, * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE
) WHERE R < 2;

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

SELECT A.ROWNUM, A.* FROM ACCOUNTING A WHERE ID = 123456 ORDER BY DATE

ROWNUM устанавливается после возврата набора результатов, и это порядок, в котором Oracle выбрал строку из таблицы (таблиц), поэтому вы можете ограничить вывод до 10 строк, выполнив что-то вроде:

...
FROM mytable
where ROWNUM < 11;

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

https://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns009.htm

Другие вопросы по тегам