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