oracle rownum转移到t-sql row_number并出现错误

问题描述

简化来源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',postingdate) t

但是出错

ORDER BY子句在派生的视图,内联函数中无效 表,子查询和公用表表达式,除非TOP,OFFSET 或还指定了FOR XML。

返回。

如果我尝试按如下错误消息中所示添加OFFSET:

select t.*,postingdate OFFSET 0 ROWS) as rownum,postingdate) t 

然后显示以下错误

“ ROWS”附近的语法不正确。

那么如何重写我的plsql以在sql服务器中运行?

解决方法

子查询中的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;