2009-07-27 67 views
0

我有一个查询,返回一堆行。 但使用相同的查询我想:SQL在现有查询中获取单个值?

1.获得总行数表中的
2.获得其中certian用户名位于

眼下IM行号这样做:

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 

所以我的问题是我怎样才能得到我想要的价值尽可能“低成本”,最好在同一个查询?

感谢提前:)

回答

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 
+0

Yay,它的工作,但不知何故,如果我写SELECT *,MyRowNumber.row作为我自己,我得到两列具有相同的值,解决方案是不选择MyRowNumber ..如何获取查询的值我不知道,但它的工作:) – Moulde 2009-07-27 13:08:26

0
(SELECT Count(*) FROM user_details) 

这将是一个高速缓存(在Worktable最有可能兑现)。

(SELECT row FROM messageentries WHERE username = 'myUsername') 

对于这其中,最可能是Lazy Spool(或Eager Spool)将被修建,这将被用来拉此值。

+0

我了解第一个,但你失去了我在第二个:P但是,谢谢,我真的要学习更多的SQL,有更多的比它,我想:) – Moulde 2009-07-27 13:10:57