SQL在现有查询中获取单个值?

时间:2009-07-27 12:33:26

标签: sql tsql

我有一个返回一堆行的查询。 但是我想使用相同的查询:

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

所以我的问题是如何让我想要的价值尽可能“低成本”,最好是在同一个查询中?

提前致谢:)

2 个答案:

答案 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),用于提取此值。