Мне трудно преобразовать хранимые процедуры из SQL Server в Oracle, чтобы наш продукт был совместим с ним.
У меня есть запросы, которые возвращают самую последнюю запись некоторых таблиц на основе метки времени:
SQL Server:
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC
=> Это вернет мне самую последнюю запись
Но Oracle:
SELECT *
FROM raceway_input_labo
WHERE rownum <= 1
ORDER BY t_stamp DESC
=> Это вернет мне самую старую запись (вероятно, в зависимости от индекса), независимо от ORDER BY
утверждения!
Я инкапсулировал запрос Oracle таким образом, чтобы он соответствовал моим требованиям:
SELECT *
FROM
(SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC)
WHERE rownum <= 1
и это работает. Но для меня это звучит как ужасный взлом, особенно если у меня много записей в задействованных таблицах.
Как лучше всего этого добиться?
sql
oracle
sql-order-by
rownum
Larry
источник
источник
Ответы:
where
Заявление запускается на выполнение , прежде чемorder by
. Итак, ваш желаемый запрос гласит: « возьмите первую строку, а затем отсортируйте ее поt_stamp
убыванию ». И это не то, что вы хотели.Метод подзапроса - подходящий метод для этого в Oracle.
Если вам нужна версия, которая работает на обоих серверах, вы можете использовать:
Внешний
*
вернет "1" в последнем столбце. Чтобы избежать этого, вам нужно будет перечислить столбцы по отдельности.источник
ROW_NUMBER()
Вместо этого используйте .ROWNUM
это псевдостолбец иROW_NUMBER()
функция. Вы можете прочитать о различиях между ними и увидеть разницу в выводе запросов ниже:источник
ROWNUM
может быть быстрее, чемROW_NUMBER()
так, следует ли использовать одно вместо другого, зависит от ряда факторов.Альтернативный вариант, который я бы предложил в этом случае использования, - использовать MAX (t_stamp) для получения последней строки ... например
Мое предпочтение шаблона кодирования (возможно) - надежное, обычно работает на уровне или лучше, чем попытка выбрать 1-ю строку из отсортированного списка - также намерение более читабельно.
Надеюсь это поможет ...
SQLer
источник
Задокументировано несколько проблем с дизайном в комментарии выше. Вкратце, в Oracle вам нужно ограничить результаты вручную, если у вас есть большие таблицы и / или таблицы с одинаковыми именами столбцов (и вы не хотите явно вводить их все и переименовывать их все). Простое решение - определить точку останова и ограничить ее в своем запросе. Или вы также можете сделать это во внутреннем запросе, если у вас нет ограничения конфликтующих имен столбцов. Например
существенно сократит результаты. Затем вы можете ЗАКАЗАТЬ или даже выполнить внешний запрос для ограничения строк.
Кроме того, я думаю, что у TOAD есть функция ограничения строк; но не уверен, что это ограничение в рамках фактического запроса на Oracle. Точно сказать не могу.
источник