从连接的查询中选择最新数据的前1位

时间:2014-08-02 20:51:38

标签: sql linq

这是我的查询

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 )

它会返回

enter image description here

但我在我的桌子enter image description here

上有这个

所以我希望结果enter image description here

还有其他条目 如果我哪里出错了,有人可以指导我吗?如果可能的话,帮我把它转换成LINQ ..

抱歉我的解释不好.. :)

TIA

2 个答案:

答案 0 :(得分:2)

你的子查询声明:

,有些东西可疑
FROM     dbo.tbl_UserAuthDetail
WHERE    A.UserID = U.UserID

AU都在子查询之外,因此该子句根本不会限制子查询。

尝试类似:

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。