使用不带别名的row_number()的不明确的列名

时间:2015-05-06 18:28:24

标签: sql sql-server row-number

我尝试在使用视图中的信息构建的查询中实现分页,当我不知道哪个表时,我需要在列上使用row_number()函数来自。

 SELECT * FROM (
      SELECT class.ID as ID, user.ID as USERID, row_number() over (ORDER BY
      ID desc) as row_number FROM class, user
 ) out_q WHERE row_number > @startrow ORDER BY row_number

问题是我只有来自上一个查询的结果列名称(ID或USERID)。如果我执行此查询,则会引发错误'不明确的列名称" ID"'。有没有办法指定我引用正在选择的列ID而不是来自不同的表?

是否可以为查询结果本身指定别名?

我已经尝试了以下内容,

 SELECT TOP 30 * FROM (
      SELECT *, row_number() over (ORDER BY ID desc) as row_number FROM(
           SELECT class.ID as ID, user.ID as USERID FROM class, user
      ) in_q
 ) out_q WHERE row_number > @startrow ORDER BY row_number

它有效,但SGBD对它必须使用哪个查询计划感到困惑,因为外部查询中存在小行目标,内部查询返回大量结果,当@startrow是一个小数字时,查询在不到一秒的时间内执行,当它是一个大数字时,查询需要几分钟才能执行。

2 个答案:

答案 0 :(得分:1)

您的问题是id本身的row_number。如果您想要一个稳定的排序,那么请包含两个ID:

SELECT *
FROM (SELECT class.ID as ID, user.ID as USERID,
             row_number() over (ORDER BY class.ID desc, user.id) as row_number
      FROM class CROSS JOIN user
     ) out_q
WHERE row_number > @startrow
ORDER BY row_number;

我认为笛卡尔积是故意的。有时,这表示查询中存在错误。一般来说,我建议你不要在from子句中使用逗号。如果您确实需要笛卡尔积,请使用CROSS JOIN明确表示。

答案 1 :(得分:1)

您可以尝试使用您已尝试的选项,然后使用\t\n\r\f提示。

OPTIMIZE FOR

请在此处查看MSDN文档中提示的说明:https://msdn.microsoft.com/en-us/library/ms181714.aspx