#tsql #plsql #rownum
#tsql #plsql #rownum
Вопрос:
упрощенный исходный pl_sql — это
select t.*, staff_no||'-'||rownum as pk
from (select * from hrmmgr.posting where type not in ('X','C') order by staff_no, postingdate) t;
Я пытаюсь переписать его для запуска на sql Server как
select t.*, staff_no '-' t.rownum as pk
from (select row_number() over (order by staff_no, postingdate) as rownum, *
from posting where type not in ('X','C') order by staff_no, postingdate) t
но ошибка
Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если также не указано значение TOP, OFFSET или FOR XML.
возвращается.
Если я попытаюсь добавить СМЕЩЕНИЕ, как показано в сообщении об ошибке следующим образом:
select t.*, staff_no '-' t.rownum as pk
from (select row_number() over (order by staff_no, postingdate OFFSET 0 ROWS) as rownum, *
from posting where type not in ('X','C') order by staff_no, postingdate) t
затем отображается следующая ошибка.
Неправильный синтаксис рядом с ‘ROWS’.
Итак, как переписать мой plsql для запуска на sql server?
Ответ №1:
ORDER BY
Предложение в подзапросе, по-видимому, является проблемой, и SQL Server сообщает вам, что ORDER BY
не может появиться в подзапросе без использования чего-то вроде TOP
. Однако здесь даже не должно быть необходимости, потому что ваш вызов ROW_NUMBER
уже указывает ORDER BY
предложение, которое будет использоваться при назначении номеров строк. Попробуйте эту версию:
SELECT t.*, staff_no '-' t.rownum AS pk
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY staff_no, postingdate) AS rownum, *
FROM posting
WHERE type NOT IN ('X', 'C')
) t;
Комментарии:
1. О, я неправильно понимаю, что сообщение об ошибке order by означает, что порядок в row_number() завершен.