在sql server 2008中嵌套选择
问题描述:
我将用户登录保存在名为loginstats的表中,我想检索每个用户的最后一次登录,我使用这些代码但我遇到了一些错误,我的错误是什么?在sql server 2008中嵌套选择
select *
from loginStats
where id in (
select distinct username, MAX(id) as id
from loginStats
group by username)
答
select *
from loginStats
where id in (
select distinct MAX(id) as id
from loginStats
group by username)
你不能在你的IN
子查询多场输出。
答
您正在做id IN
,但正试图将其与多列进行比较。试试这个:
SELECT A.*
FROM LoginStats A
INNER JOIN (SELECT DISTINCT username, MAX(id) as id
FROM loginStats
GROUP BY username) B
ON A.username = B.username AND A.id = B.id
答
的错误是IN子句中只有一列可以指定与你指定两个:username
和id
。
答
您正在选择两个字段,您应该只返回一个字段。此相关子查询应该为你工作:
select *
from loginStats AS a
where id = (
select MAX(id) as id
from loginStats AS b
where b.username = a.username)
答
或者你也可以做到这一点是这样的:
;WITH CTE
AS
(
SELECT
RANK() OVER(
PARTITION BY loginStats.username
ORDER BY loginStats.id DESC
) AS iRank,
loginStats.*
FROM
loginStats
)
SELECT
*
FROM
CTE
WHERE
CTE.iRank=1
Here是一些信息,如何使用rank
功能以及它是如何应用。
Here是msdn上关于rank
函数的一些信息。
Here约为cte
的功能和用法的一些信息
Here是一些有关With
条款以及如何使用
希望它可以帮助你了解
什么是“ID”,它是如何涉及“上次登录”?你为什么要做一个子选择?也许你可以解释(a)你的模式和(b)你得到什么错误? – Joe 2012-02-27 19:23:36