可以将其写为单个SQL Server存储过程

时间:2013-03-21 17:01:40

标签: sql sql-server-2008

我在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个查询。

我可以在一个选项中执行此操作,还是需要分阶段执行此操作并使用临时表?

1 个答案:

答案 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