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

SQL是否在现有查询中获取单个值?,sql,tsql,Sql,Tsql,我有一个返回一堆行的查询。 但使用相同的查询,我想: 1。获取表中的总行数 2。获取认证用户名所在的行号 现在我是这样做的: BEGIN DECLARE @startRowIndex INT; DECLARE @PageIndex INT; DECLARE @RowsPerPage INT; SET @PageIndex = 0; SET @RowsPerPage = 15; SET @startRowIndex = (@PageIndex * @RowsPerPage) +

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

1。获取表中的总行数
2。获取认证用户名所在的行号

现在我是这样做的:

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
所以我的问题是,我如何才能得到我想要的值,尽可能“低成本”,最好是在同一个查询中

提前感谢:)

试试这个

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
这一个将被缓存(很可能在
工作表中具体化)


对于这一个,很可能会构建一个
惰性假脱机
(或
急切假脱机
),用于提取此值。

是的,它可以工作,但不知何故,如果我像我一样编写SELECT*,MyRowNumber.row,我会得到两个具有相同值的列,解决方案是根本不选择MyRowNumber。。值是如何进入查询的我不知道,但它是有效的:)我理解第一个,但你在第二个上失去了我:P但是谢谢,我真的需要学习更多的SQL,比我想象的要多得多:)@molde:a
spool
是根据子查询结果构建的临时索引(在您的情况下,它将是
用户名
)上的索引。
即时假脱机
一次为所有值编制索引,而
延迟假脱机
从临时索引返回已编制索引的值,当要求提供尚未编制索引的值时,它将重新扫描子查询并将该值添加到索引中。
(SELECT Count(* ) FROM   user_details)
(SELECT row FROM messageentries WHERE username = 'myUsername')