这是我的查询
SELECT u.UserID ,
A.Username ,
A.Password ,
A.CreatedOn
FROM dbo.tbl_User U
INNER JOIN dbo.tbl_UserAuthDetail A ON A.UserID = U.UserID
AND A.CreatedOn IN (
SELECT TOP 1
CreatedOn
FROM dbo.tbl_UserAuthDetail
WHERE A.UserID = U.UserID
ORDER BY CreatedOn DESC )
它会返回
但我在我的桌子
上有这个所以我希望结果
还有其他条目 如果我哪里出错了,有人可以指导我吗?如果可能的话,帮我把它转换成LINQ ..抱歉我的解释不好.. :)
TIA
答案 0 :(得分:2)
你的子查询声明:
,有些东西可疑FROM dbo.tbl_UserAuthDetail
WHERE A.UserID = U.UserID
A
和U
都在子查询之外,因此该子句根本不会限制子查询。
尝试类似:
FROM dbo.tbl_UserAuthDetail A2
WHERE A2.UserID = U.UserID
作为替代解决方案,SQL Server具有窗口功能:
select *
from (
select row_number() over (
partition by u.UserID
order by a.createdon desc) rn
, *
from dbo.tbl_user u
join dbo.tbl_userauthdetail a
on a.userid = u.userid
) as SubQueryAlias
where rn = 1 -- Only latest authdetail per user
或者您可以使用cross apply
:
select *
from dbo.tbl_user u
cross apply
(
select top 1 *
from dbo.tbl_userauthdetail a
where a.userid = u.userid
order by
a.createdon desc
) a
答案 1 :(得分:0)
尝试使用:
select u.userid, a.username, a.password, a.createdon
from dbo.tbl_user u
join dbo.tbl_userauthdetail a
on a.userid = u.userid
where a.createdon = (select max(x.createdon)
from dbo.tbl_UserAuthDetail x
where x.userid = a.userid)
在您的查询中,您加入了A与U。
你应该加入dbo.tbl_UserAuthDetail与A。
以上就是这样,虽然我给了dbo.tbl_UserAuthDetail一个X的别名。
我还将子查询移动到WHERE子句中,因为它不是连接条件。
我还选择了max(createdon),它在功能上等同于使用'first 1 order by createdon desc',但它更通用sql。