2017-12-07 5 views
0

元は、 "UPSERT"を達成するためにIF/ELSEを使用しましたが、MERGEと私の問題MERGEを使用すると、2つのソースを使用できないようです。ここで複数のソースを持つTSQL MERGE

はアップサートで私のオリジナルの試みです:

IF ((SELECT COUNT(CAST(StudentuserID AS int)) FROM HL_StudentAttendance WHERE StudentUserID=1)>0) 
UPDATE HL_StudentAttendance 
SET 
CID = CAST('[querystring:CID]' AS int), 
CalendarEventID = CAST('[querystring:CEID]' AS int), 
StudentUserID = CAST('[StudentUserID]' AS int), 
Attendance = '[Attendance]' 
ELSE 
INSERT INTO HL_StudentAttendance 
(CID,CalendarEventID,StudentUserID,Attendance) 
VALUES 
(CAST('[querystring:CID]' AS int), CAST('[querystring:CEID]' AS int), CAST('[StudentsUserID]' AS int),'[Attendance]') 

IF文の結果は8であってもそう8>0それは私のif/elseロジックが欠落している場合、それは常にわからない挿入を実行している私の更新を実行する必要があります何か。ここで

MERGE

MERGE 
    HL_StudentAttendance AS target 
USING 
    HL_CourseRegistrations AS source 
ON 
    target.StudentUserID = source.UserID 
    AND source. 
WHEN MATCHED THEN 
    UPDATE SET 
    Attendance = '[Attendance]' 
WHEN NOT MATCHED THEN 
    INSERT (CID, CalendarEventID, StudentUserID, Attendance) VALUES ('[querystring:CID]', '[querystring:CEID]', '[UserID]', '[Attendance]') 
; 

との試みである、ここで私の問題は、私がCalendarEventIDされ、追加のソースアイテムをつかむために使用する必要があり、私のテーブルHL_CourseEvents内のデータが別の方法MERGE作品が、挿入がにエントリが重複しているということです私のHL_StudentAttendanceにはパラメータがありませんCalendarEventID

何か提案がありがとうございます。

UPDATE

次のクエリは何も出席フィールドに変更はなく、正しく更新されている場合、それは新しいレコードを挿入だこと以外は、作業を行います。私の更新のWHERE句はそこにないので、私は疑う。実行エラーが発生して追加しようとしました。

MERGE HL_StudentAttendance 
USING 
(
SELECT cr.CID, ce.CalendarEventID, cr.UserID FROM HL_CourseRegistrations cr 
JOIN HL_CalendarEvents ce 
ON ce.CID = cr.CID 
) tmpTable 
ON 
HL_StudentAttendance.StudentUserID = tmpTable.UserID 
AND HL_StudentAttendance.CalendarEventID = tmpTable.CalendarEventID 
WHEN MATCHED THEN 
UPDATE 
SET 
Attendance = 'Attended Late' 
WHEN NOT MATCHED THEN 
INSERT (CID,CalendarEventID,StudentUserID,Attendance) VALUES ('1','1','1','555') 
; 

クエリの実行結果が2回表示されます。私はそれを実行し続けると、更新の代わりに常に多くを挿入します:

ID CID CalendarEventID StudentUserID Attendance 
1 1 1    1    Attended Late 
2 1 1    1    Attended Late 
3 1 1    1    Attended Late 
4 1 1    1    Attended Late 
5 1 1    1    Attended Late 
6 1 1    1    555 
7 1 1    1    555 
8 1 1    1    555 
9 1 1    1    555 

答えて

1

追加情報に基づいて、以下を試してください。私はデモのためだけにスキーマといくつかのデータを一緒にハックしましたので、スキーマの比較方法を見なければなりません。しかし、下の2つの例は、あなたが信じていることを信じています。最初のレコードは、ユーザーIDに基づいて存在しない場合は新しいレコードを挿入します。存在する場合には「遅れて出席しました」と記録する2番目のマーク。実生活では、複数のコースに登録できるようになるため、複数のパラメータが必要になる可能性があるので、コースまたはカレンダーのイベントIDも渡す必要があります。これがあなたを始めるか、何か追加が必要な場合はお知らせください。

-- 
------------------------------------------------- 
CREATE TABLE [test].[HL_StudentAttendance] 
    (
     [StudentUserID]  INT 
     , [CalendarEventID] INT 
     , [Attendance]  NVARCHAR(250) 
     , [CID]    INT 
); 

CREATE TABLE [test].[HL_CourseRegistrations] 
    (
     [CID]  INT 
     , [UserID] INT 
); 

CREATE TABLE [test].[HL_CalendarEvents] 
    (
     [CalendarEventID] INT 
     , [CID]   INT 
); 

go 

-- 
------------------------------------------------- 
INSERT INTO [test].[HL_CourseRegistrations] 
      ([CID] 
      , [UserId]) 
VALUES  (1,1), 
      (3,4), 
      (4,5); 

INSERT INTO [test].[HL_CalendarEvents] 
      ([CalendarEventID] 
      , [CID]) 
VALUES  (1,1); 

go 

-- 
------------------------------------------------- 
CREATE PROCEDURE [test].[set_attendance] @user INT 
AS 
    BEGIN 
     MERGE INTO [test].[HL_StudentAttendance] AS [target] 
     USING (SELECT [cr].[CID] 
         , [ce].[CalendarEventID] 
         , [cr].[UserID] 
       FROM [test].[HL_CourseRegistrations] [cr] 
         JOIN [test].[HL_CalendarEvents] [ce] 
         ON [ce].[CID] = [cr].[CID]) AS [source] 
     ON [target].[StudentUserID] = @user 
      AND [target].[CalendarEventID] = [source].[CalendarEventID] 
     WHEN MATCHED THEN 
      UPDATE SET [Attendance] = 'Attended Late' 
     WHEN NOT MATCHED BY target THEN 
      INSERT ([CID] 
        , [CalendarEventID] 
        , [StudentUserID] 
        , [Attendance]) 
      VALUES ('1' 
        , '1' 
        , @user 
        , '555'); 
    END; 

go 

-- 
-- inserts a new record 
------------------------------------------------- 
EXECUTE [test].[set_attendance] 
    @user=12; 

SELECT * 
FROM [test].[HL_StudentAttendance]; 


-- 
-- marks an existing record as late 
------------------------------------------------- 
EXECUTE [test].[set_attendance] 
    @user=12; 

SELECT * 
FROM [test].[HL_StudentAttendance]; 
+0

ありがとうございました。 「出席」の設定は、ユーザが定義した手動プロセスである。私の問題は、このクエリで更新する 'UserID'を指定することができないということです。 – UserSN

+0

5つのレコードを初めて挿入するクエリを実行するときに、データのマッチングのどこかに問題があります。私には5人の学生がいます。私はそれを2回目に実行し、私のレコードを1つ更新し、この時点で挿入する代わりに5つの新しいレコードを挿入して更新する必要があります。 – UserSN

+0

Aha!プロシージャでそれを使用していると仮定すると、私のプレゼンテーションのプレゼンテーション[プレゼンテーション](https://github.com/KELightsey/chamomile/blob/master/presentation/merge.sql)にあるようなものを使用します([flower]、[color]))として((値(@flower、 @color)を使用して)パラメータを使用して[マージ]します。昼食はちょうど私たちのオフィスに到着しました。その後もヒントが必要な場合は、私は更新することができます。 –

関連する問題