私は、ユーザーが持っているステッカーを保存しているプロジェクトを持っており、ユーザーと取引できる他のユーザーと照合したいと思っています。カーソルを使用しないでSQL Serverのコードを一致させる
私が持っているテーブルは以下のとおりです。
User
--------------
UserId
Sticker
-------------
Id
UserStickers
-------------
UserId
StickerId
Count
例データ:
User
-------------
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1'
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B'
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5'
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18'
Sticker
-------------
1
2
3
4
5
6
7
8
9
10
UserStickers
-------------
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1', 1, 2
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1', 2, 1
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1', 3, 3
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 1, 3
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 2, 1
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 4, 3
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 5, 2
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 6, 1
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 1, 2
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 4, 3
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 8, 2
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 10, 3
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 1, 1
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 4, 5
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 7, 2
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 8, 2
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 9, 2
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 10, 2
私は与えられたユーザのためのベストマッチを見つけるしたいと思います。 IEでは、他のユーザーはステッカーを持っていません。しかし、元のユーザーが他のユーザーに与えることができるステッカーを知る必要があります。私は今、私のマッチングコードを記述しようとしています、と私は良いトップ20ユーザーが元のユーザーにステッカーを与えるために得ることができます
CREATE FUNCTION StickerNeeds (@UserId UNIQUEIDENTIFIER)
RETURNS @StickerNeeds TABLE
(
StickerId INT
)
AS
BEGIN
DECLARE @SearchUsersStickers TABLE
(
StickerId int
);
INSERT INTO @SearchUsersStickers
SELECT StickerId
FROM UserStickers
WHERE UserId = @UserId;
INSERT @StickerNeeds
SELECT
S.Id
FROM
Stickers S
LEFT JOIN
@SearchUsersStickers SUS
ON
S.Id = SUS.StickerId
WHERE
SUS.StickerId IS NULL
RETURN
END
:
は私が機能StickerNeeds
を作成しました。しかし、ステッカーが必要なものの数を計算することは、ゆっくりと実行されるカーソルなしでは困難であることが証明されています。
ここに私が現在持っているものはありますが、返すステッカーを生成する最後のステートメントは何も返しません。
DECLARE @UserId UNIQUEIDENTIFIER = 'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1'
DECLARE @UserMatches TABLE
(
UserId UNIQUEIDENTIFIER,
StickerTake int,
StickerGive int
);
INSERT INTO @UserMatches
SELECT TOP 20
UserId,
Count(*),
NULL
FROM
UserStickers US
INNER JOIN
StickerNeeds(@UserId) SUN
ON
US.StickerId = SUN.StickerId
WHERE
US.[Count] > 1
GROUP BY
UserId
ORDER BY
Count(*) DESC
-- Find Stickers to Give AND UPDATE @UserMatches
SELECT
UM.UserId,
COUNT(*) As StickerCount
FROM
(SELECT
US.StickerId AS StickerId
FROM
dbo.UserStickers US
WHERE
US.UserId = @UserId
AND US.[Count] > 1
) STG -- StickerToGive
LEFT JOIN
UserStickers US
ON
US.StickerId = STG.StickerId
LEFT JOIN
@UserMatches UM
ON
US.UserId = UM.UserId
WHERE
US.StickerId IS NULL
GROUP BY
UM.UserId
SELECT * FROM @UserMatches
理想的@UserMatchesは、起点ユーザーが取ることができるステッカーの数と発信元ユーザが与えることができるステッカーの数を一致したユーザーが含まれます。私はカーソルを使用しないで与えることはできません。
http://stackoverflow.com/help/how-to-ask – Chris
こんにちはクリス・MayhemSoftware @、どのようなあなたは私の時に拡大したいと思いますか? –
あなたの質問にいくつかのテスト(ダミー)データを追加する気がしますか? –