我有一个返回一堆行的查询。 但是我想使用相同的查询:
1。获取表格中的总行数
的 2。获取certian用户名所在的行号
现在我这样做:
BEGIN
DECLARE @startRowIndex INT;
DECLARE @PageIndex INT;
DECLARE @RowsPerPage INT;
SET @PageIndex = 0;
SET @RowsPerPage = 15;
SET @startRowIndex = (@PageIndex * @RowsPerPage) + 1;
WITH messageentries
AS (SELECT Row_number()
OVER(ORDER BY score DESC) AS row,
Count(DISTINCT town.townid) AS towns,
user_details.username,
user_score.score,
allience.alliencename,
allience.allienceid,
allience.alliencetagname,
(SELECT Count(* ) FROM user_details) AS numberofrows
FROM user_details
INNER JOIN user_score
ON user_details.username = user_score.username
INNER JOIN town
ON user_details.username = town.townownername
LEFT OUTER JOIN allience_roles
ON user_details.useralliencerole = allience_roles.roleid
LEFT OUTER JOIN allience
ON allience_roles.allienceid = allience.allienceid
GROUP BY user_details.username,
user_score.score,
allience.alliencename,
allience.allienceid,
allience.alliencetagname)
SELECT *, (SELECT row FROM messageentries WHERE username = 'myUsername') AS myself
FROM messageentries
WHERE row BETWEEN @startRowIndex AND @StartRowIndex + @RowsPerPage - 1
END
这样可行,但是不是两个嵌套的选择对表中的每一行都运行一次? :/
...
(SELECT Count(* ) FROM user_details) AS numberofrows
...
(SELECT row FROM messageentries WHERE username = 'myUsername') AS myself
所以我的问题是如何让我想要的价值尽可能“低成本”,最好是在同一个查询中?
提前致谢:)
答案 0 :(得分:1)
试试这个......
DECLARE @NumberOfRows INT
SELECT @NumberOfRows = Count(* ) FROM user_details
WITH messageentries
AS (SELECT Row_number()
OVER(ORDER BY score DESC) AS row,
Count(DISTINCT town.townid) AS towns,
user_details.username,
user_score.score,
allience.alliencename,
allience.allienceid,
allience.alliencetagname,
@NumberOfRows AS numberofrows
FROM user_details
INNER JOIN user_score
ON user_details.username = user_score.username
INNER JOIN town
ON user_details.username = town.townownername
LEFT OUTER JOIN allience_roles
ON user_details.useralliencerole = allience_roles.roleid
LEFT OUTER JOIN allience
ON allience_roles.allienceid = allience.allienceid
GROUP BY user_details.username,
user_score.score,
allience.alliencename,
allience.allienceid,
allience.alliencetagname)
SELECT *, MyRowNumber.row AS myself
FROM messageentries,
(SELECT row FROM messageentries WHERE username = 'myUsername') MyRowNumber
WHERE row BETWEEN @startRowIndex AND @StartRowIndex + @RowsPerPage - 1
答案 1 :(得分:0)
(SELECT Count(* ) FROM user_details)
这个将被缓存(最有可能在Worktable
中实现)。
(SELECT row FROM messageentries WHERE username = 'myUsername')
对于这个,很可能会构建Lazy Spool
(或Eager Spool
),用于提取此值。