我在2个独立的数据库中有2个表。
表1包含我需要通过存储过程检索的用户信息。
表2(在db2
中)具有表1中用户ID的外键。但是每个用户在此表中可能有许多行数据。
我想从此表中检索最旧的记录。
即
db1.dbo.userProfile
id int
...
db2.dbo.userRecords
id int
fk_userProfile int
DateCreated DateTime
.....
以及如果我的数据是
的例子table 1
id otherData
1 ...
table 2
id fk_userProfile oldestDate otherData
1 1 10/10/2012 ....
2 1 09/10/2012 ....
3 2 10/10/2012 ....
4 1 03/03/2013 ....
我想退出用户1
id = 1, profiledata, 10/10/2012
这是我最初尝试过的,但它正在返回前1位用户,我需要为所有用户提供。此外,无法保证最早的日期是第一个记录。
SELECT TOP 1 LastDate as RenewalDate, u.*
FROM db2.dbo.ActionDates AS uad
INNER JOIN Users AS u ON uad.UserId = u.Id
WHERE u.shopId = @shop
我有两个存储过程,在我的代码中我获得了所有用户的商店,然后循环所有用户并在选择和订购后执行前1的另一个表上执行选择,但是如果我有一个商店的50个用户,那就是51个查询。
我可以在一个选项中执行此操作,还是需要分阶段执行此操作并使用临时表?
答案 0 :(得分:0)
试试这个
对于您的样本数据和结果,请使用此
;with CTE as
(
select * , row_number() over (parition by up.id order by ud.id) rn
from userprofile up
inner join userrcord ud on up.id = ud.fk_userProfile
)
select * from cte where rn = 1
要获得每个用户的第一行,您的示例查询应为:
;with CTE as
(
SELECT LastDate as RenewalDate, u.* ,
row_number() over (parition by userid order by lastdate) rn
-- replace order by lastdate with order by ActionDates.id if you store any id
FROM db2.dbo.ActionDates AS uad
INNER JOIN Users AS u ON uad.UserId = u.Id
WHERE u.shopId = @shop
)
select * from cte where rn = 1