我尝试在使用视图中的信息构建的查询中实现分页,当我不知道哪个表时,我需要在列上使用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是一个小数字时,查询在不到一秒的时间内执行,当它是一个大数字时,查询需要几分钟才能执行。
答案 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。