0

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

私はこれを2つのストアドプロシージャで機能させました.コードでは、ショップのすべてのユーザーを取得し、すべてのユーザーをループして、選択して注文した後にトップ1を行う他のテーブルで選択を行いますが、 1 つのショップに 50 人のユーザーがいる場合、それは 51 のクエリです。

それで、これを1回の選択で行うことができますか、それとも段階的に行って一時テーブルを使用する必要がありますか?

4

1 に答える 1

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
于 2013-03-21T17:08:29.650 に答える