2014-06-23 2 views
0

나는 두 개의 테이블이있다. MasterNotes 테이블의 기존 메모를 업데이트하거나 계좌 번호가 아직 MasterNotes 표에없는 경우 새 메모를 삽입해야합니다.Upsert SQL Server 2005의

두 테이블 모두 REPORT, ACCOUNT_NUMBER, NOTES의 세 열이 있습니다.

레코드를 업데이트하려면 계좌 번호와 리포트가 동일해야합니다 (MasterNotes 테이블은 서로 다른 두 개의 계좌 번호와 두 개의 다른 리포트를 가질 수 있습니다).

아무도 도와 드릴 수 있습니까?

여기 내 생각은 지금까지의 :

IF NOT EXISTS 
(
SELECT REP, ACCOUNT_NUMBER 
FROM MasterNotes 
WHERE REP = (SELECT Report FROM NewNotes) AND 
     ACCOUNT_NUMBER = (SELECT AccountNo FROM NewNotes) 
) 
INSERT INTO MasterNotes 
ELSE 
UPDATE 

나는 서브 쿼리가 하나 개 이상의 값을 반환하기 때문에 그것이 정확하지 알고,하지만 난 그것을 행에 의해 행에 대해 이동하는 방법을 잘 확인합니다.

또는 이와 비슷한 내용일까요?

INSERT INTO MasterNotes 
SELECT Report, AccountNo, A.Notes 
FROM NewNotes A 
LEFT OUTER JOIN MasterNotes B 
    ON A.Report = B.REP AND A.AccountNo = B.ACCOUNT_NUMBER 
WHERE B.ACCOUNT_NUMBER IS NULL AND B.REP IS NULL 
UPDATE MasterNotes 
SET NOTE = B.Notes 
FROM MasterNotes A, NewNotes B 
WHERE A.ACCOUNT_NUMBER = B.AccountNo AND A.REP = B.Report 
+0

이 우리를보기 지금까지 시도했다 다음과 같이 당신이 이제까지 SQL2008 +로 업데이트해야, 당신은 MERGE 기능을 사용할 수 있습니다! 우리는 당신이 가지고있는 문제로 기쁠 것입니다. 그러나 그렇다고해서 제 코드 *를 써주는 것이 아닙니다. ** 처음에는 당신 자신의 노력이 필요합니다! –

답변

0

다음은 몇 가지 샘플입니다. SQL2005에서 두 가지 작업을 수행하는 두 가지 방법을 제공했습니다. 개인적으로 JOIN 방식을 선호하지만 약간 더 느린 것으로 나타났습니다. 그러나 쓰기/읽기가 더 쉽습니다. 그들은 안에 있지만 주석 처리되어 있습니다.

DECLARE @NewNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50)) 
DECLARE @MasterNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50)) 

INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES) 
SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE, SOMETIMES...' UNION 
SELECT 'DEF', 456, 'CUSTOMER IS ANGRY' 

INSERT INTO @NewNotes (REPORT, ACCOUNT_NUMBER, NOTES) 
SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE' UNION 
SELECT 'DEF', 456, 'CUSTOMER IS ANGRY' UNION 
SELECT 'GHI', 789, 'CUSTOMER WANTS CALL BACK' 

UPDATE M SET NOTES = N.NOTES 
FROM @MasterNotes M, @NewNotes N 
WHERE M.REPORT = N.REPORT 
AND M.ACCOUNT_NUMBER = N.ACCOUNT_NUMBER 

/** ALTERNATE UPDATE METHOD **/ 
--UPDATE M SET NOTES = N.NOTES 
--FROM @MasterNotes M 
--JOIN @NewNotes N 
-- ON M.REPORT = N.REPORT 
-- AND M.ACCOUNT_NUMBER = N.ACCOUNT_NUMBER 

INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES) 
SELECT N.REPORT, N.ACCOUNT_NUMBER, N.NOTES 
FROM @NewNotes N 
WHERE NOT EXISTS (SELECT ACCOUNT_NUMBER FROM @MasterNotes M WHERE M.REPORT = N.REPORT) 

/** ALTERNATE INSERT METHOD **/ 
--INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES) 
--SELECT N.REPORT, N.ACCOUNT_NUMBER, N.NOTES 
--FROM @NewNotes N 
--LEFT OUTER JOIN @MasterNotes M 
-- ON N.REPORT = M.REPORT 
-- AND N.ACCOUNT_NUMBER = M.ACCOUNT_NUMBER 
--WHERE M.ACCOUNT_NUMBER IS NULL 

SELECT * 
FROM @MasterNotes 

NB :

DECLARE @NewNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50)) 
DECLARE @MasterNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50)) 

INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES) 
SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE, SOMETIMES...' UNION 
SELECT 'DEF', 456, 'CUSTOMER IS ANGRY' 

INSERT INTO @NewNotes (REPORT, ACCOUNT_NUMBER, NOTES) 
SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE' UNION 
SELECT 'DEF', 456, 'CUSTOMER IS ANGRY' UNION 
SELECT 'GHI', 789, 'CUSTOMER WANTS CALL BACK' 

MERGE INTO @MasterNotes AS DST 
USING (SELECT REPORT, ACCOUNT_NUMBER, NOTES FROM @NewNotes) AS SRC 
    ON SRC.ACCOUNT_NUMBER = DST.ACCOUNT_NUMBER 
WHEN MATCHED THEN UPDATE 
    SET DST.REPORT = SRC.REPORT, 
     DST.NOTES = SRC.NOTES 
WHEN NOT MATCHED THEN 
    INSERT (REPORT, ACCOUNT_NUMBER, NOTES) 
    VALUES (SRC.REPORT, SRC.ACCOUNT_NUMBER, SRC.NOTES); 

SELECT * 
FROM @MasterNotes