SQL是否在现有查询中获取单个值?
我有一个返回一堆行的查询。 但使用相同的查询,我想: 1。获取表中的总行数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) +
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:aspool
是根据子查询结果构建的临时索引(在您的情况下,它将是用户名
)上的索引。即时假脱机
一次为所有值编制索引,而延迟假脱机
从临时索引返回已编制索引的值,当要求提供尚未编制索引的值时,它将重新扫描子查询并将该值添加到索引中。
(SELECT Count(* ) FROM user_details)
(SELECT row FROM messageentries WHERE username = 'myUsername')