передача oracle rownum в t-sql row_number() завершена с ошибкой

#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() завершен.