2014-10-22 2 views
2

이 병합 성명서는 나에게 비효율적 인 것으로 보입니다. 삽입/업데이트 전 완전히 새로운 테이블을 만든 다음 해당 테이블에 병합하여 더 좋은 방법이 있습니까?비효율적 인 1 행의 병합

DECLARE @dbEntry TABLE(
Email varchar(100) 
,DateRedeemed datetime 
) 
INSERT INTO @dbEntry VALUES (@Email, @DateRd) 

MERGE [dbo].[Redeemers] AS dbTarget 
USING 
(
SELECT * FROM @dbEntry 
) 
AS dbSource 
ON 
(
dbSource.Email = dbTarget.Email 
) 

WHEN MATCHED 
.... 

WHEN NOT MATCHED 
... 

추 신 :이 쿼리는 표시 목적으로 단순화되었으며, 더 많은 열과 이전과 이후의 작업이 더 많습니다.

+0

"비효율적 인"것은 무엇을 의미합니까? 달성하려는 것은 무엇입니까? 주어진 진술은 너무 일반적이어서 더 나은 해결책이 있는지 알기 어렵습니다. –

+0

새 테이블을 만들고 삽입하지 않고 들어오는 매개 변수를 병합하는 방법이 있습니까? – RealityDysfunction

+1

'완전히 새로운 테이블 '그것은 테이블 변수가 아니라 테이블입니다. 실제 영구 지속 테이블보다 테이블 변수를 생성하는 오버 헤드가 훨씬 적습니다. 또한 단일 행을 삽입합니다. – Brandon

답변

2

왜 그렇게하지 않습니까?

MERGE [dbo].[Redeemers] AS dbTarget 
USING 
(
SELECT @Email as Email, @DateRd as DateRd 
) 
AS dbSource 
ON 
(
dbSource.Email = dbTarget.Email 
) 

WHEN MATCHED 
.... 

WHEN NOT MATCHED 
... 
1

MERGEINSERT/UPDATE 결정이 각 행에 대해 이루어질 필요가 처리하는 복수의 열을 위해 설계된다. 이 작업을 수행 할 수 있기 때문에 단지 한 행으로는 효과가 없습니다.

IF EXISTS(SELECT NULL FROM Redeemers WHERE Email = @Email) 
    UPDATE Redeemers SET DateRedeemed = @DateRd WHERE Email = @Email 
ELSE 
    INSERT INTO Redeemers (Email, DateRedeemed) VALUES (@Email, @DateRd) 
ENDIF 
+0

내가 틀렸다고 정정하되,이 경우에는 추가로 SELECT가 발생하지 않습니까? – RealityDysfunction

+0

@RealityDysfunction : yes. 그러나 'MERGE'는 마법이 아닙니다. 행이 존재하는지 먼저 확인해야합니다. 그러나 다중 명령문 솔루션을 사용하려는 경우 트랜잭션에 넣기를 원한다. 그렇지 않으면 INSERT 문이 실패하거나 중복을 삽입 할 수있다. –

+0

설명해 주셔서 감사합니다. – RealityDysfunction

관련 문제