子查询中的MSSQL:ROW_NUMBER()

时间:2018-04-24 03:08:07

标签: mysql sql-server

以下内容最初是为MySQL编写的,@ runown被定义为标量变量。

SELECT CONCAT( z.expected, IF(z.got-1>z.expected, CONCAT(' thru ',z.got-1), '') AS `Missing Receipt ID`
FROM (SELECT @rownum \\:= @rownum+1 AS expected,
IF(@rownum=recpt_id, 0, @rownum \\:= recpt_id) AS got
FROM 
(SELECT @rownum \\:= (SELECT MIN(CAST(recpt_id AS SIGNED))-1 FROM report_receipt
WHERE outlet_desc IN "+Branch+" )
) AS a
JOIN report_receipt r
ON r.outlet_desc IN "+Branch+"
ORDER BY CAST(recpt_id AS SIGNED)
) AS z
WHERE z.got!=0

我正在尝试为SQL Server平台创建相同的查询。我知道在MSSQL中,我们可以使用ROW_NUMBER函数,然后在调用ROW_NUMBER的位置使用OVER(ORDER)子句。该查询也将在我们的Java代码中以本机查询格式使用。

到目前为止,经过一些小的语法调整后,我已经达到MSSQL中的这个当前状态,但有一些不确定性:

SELECT CONCAT( z.expected, CASE WHEN z.got-1>z.expected THEN  CONCAT(' thru ',z.got-1) ELSE  '' END) AS [Missing Receipt ID]
FROM 
   (SELECT @rownum \:= @rownum+1 AS expected,
    IF(@rownum=recpt_id, 0, @rownum \:= recpt_id) AS got
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY CAST(recpt_id AS INT))) \:= (SELECT MIN(CAST(recpt_id AS INT))-1 FROM report_receipt
          WHERE outlet_desc IN "+Branch+" )
    ) AS a
JOIN report_receipt r 
ON r.outlet_desc IN ('MY011')) AS z
WHERE z.got!=0

我不确定但寻找答案的是:

  1. 如果只放置了一个ORDER子句,我们只将它放在最里面的查询中吗?对于其他地方我们只需要使用ROW_NUMBER()OVER(ORDER BY SELECT NULL)?

  2. 如果查询被认为有不必要的额外嵌套,那么另一种选择是什么,而不必重复调用太多的ROW_NUMBER函数?

  3. 提前致谢。

    注意:'\'是为Java代码添加的转义字符。

0 个答案:

没有答案