2016-08-25 5 views
0

테이블 구조의 값을 삽입, UPSERT과 통합 :하지 테이블

CREATE TABLE [dbo].[LockOfferByOfferUses](
[OfferID] [int] NULL, 
[OfferCode] [varchar](50) NULL, 
[LockCounter] [int] NULL, 
[UpdatedDate] [datetime] NULL 
) ON [PRIMARY] 

SQL의 statemnt :

merge into LockOfferByOfferUses as Target 
using (Select * from LockOfferByOfferUses Where OfferID=123 And OfferCode='abc') as Source 
on Target.OfferID = Source.OfferID 
when NOT MATCHED then 
INSERT (OfferID,OfferCode,LockCounter,UpdatedDate) VALUES (123,'abc',1,GETDATE()) 
when MATCHED then 
update set Target.LockCounter=Target.LockCounter+1; 

어떤 메신저 기록에 의해 "LockOfferByOfferUse"에 존재하는지 확인되는 일을하려고 offerID. 존재하지 않으면 레코드를 삽입하십시오. 존재하는 경우 "LockCounter"열을 업데이트하십시오.

업데이트 부분이 작동하지만 삽입이 작동하지 않습니다. "(0 행 영향을 받았습니다)"라는 메시지가 표시됩니다. 오류 메시지가 없습니다.

정말 도움이 되겠습니까.

+0

이 절과 일치하는 행이 없을 수 있습니다. 'Select * from LockOfferByOfferUses OfferID = 123 And OfferCode ='abc'' – TheGameiswar

+2

알기 어려운 데이터를 보지 않고. 쿼리는 괜찮아 보입니다. –

+0

@ TheGameiswar, 네, 데이터가 없습니다. 그래서 그 이유는 무엇입니까? – black

답변

2

소스는 사용하려는 데이터 여야하며 대상 테이블에 대한 다른 쿼리는 필요하지 않습니다.

그래서 그것이 있어야 뭔가 같은 :

merge into LockOfferByOfferUses as Target 
using (VALUES(123)) as Source (OfferID) 
on Target.OfferID = Source.OfferID 
when NOT MATCHED then 
INSERT (OfferID,OfferCode,LockCounter,UpdatedDate) VALUES (Source.OfferID,'abc',1,GETDATE()) 
when MATCHED then 
update set Target.LockCounter=Target.LockCounter+1; 

(그것은 당신이 또한 Source들로 다른 값을 이동 어디까지, 또는 단지 INSERT에서 리터럴로이 - 더 복잡한 쿼리, 여러 값에서 더 많은 값이 필요할 수도 있음).

1

"원본"테이블이 비어 있으므로 대상과 일치하는 것이 없으므로 아무 것도 삽입되지 않습니다. 데이터를 삽입하려면 원본 테이블에 삽입 할 행이 있어야합니다.

UPDATE : 의견에 대해서 : WHEN NOT MATCHED BY TARGETWHEN NOT MATCHED BY SOURCE : 사실 두 개의 서로 다른 WHEN NOT MATCHED 조항이있다. 그러나 WHEN NOT MATCHED BY TARGET 절 (기본값 인 것처럼 보임)에 대해서만 값을 삽입 할 수 있습니다. 그러나 소스 데이터가 없으므로 삽입 할 내용이 없습니다.

+0

좋아, 나는 ON 절이 일치하지 않는다면 그냥 값을 삽입해야한다고 생각했다. 내가 잘못한 것 같아. – black

1

의가에 무슨 일이 일어나고 있는지 이해하는 쿼리를 언급하자 할 대상으로 LockOfferByOfferUses에

merge into LockOfferByOfferUses as Target 

소스 쿼리 데이터, 필터 만 offerId = 123

using (Select * from LockOfferByOfferUses Where OfferID=123 And OfferCode='abc') as Source 

조건을 병합 병합

on Target.OfferID = Source.OfferID 
우리는 우리가 새로운 데이터

when NOT MATCHED then 
INSERT (OfferID,OfferCode,LockCounter,UpdatedDate) VALUES (123,'abc',1,GETDATE()) 

우리가 데이터를 일치 한 경우를 삽입 할 대상에 존재하지 않는로 행 ID가 0

우리가 업데이트

when MATCHED then 
update set Target.LockCounter=Target.LockCounter+1; 

따라서 무슨 일이에요하는 것입니다

OfferID = 123

,369 : 소스 테이블의 모든 아이디의이 목표 테이블에 존재하는, 새로운 행을 삽입 할 필요가 범인이 없습니다

항상 동일한 값을 쿼리하므로 대상에 OfferId 123이있는 항목이 있다고 가정합니다.

수정 쿼리 : 목표 테이블에 아직 종료하지 않는 OfferCode abc 방송과 함께 모든 요소를 ​​병합 할이 쿼리와

merge into LockOfferByOfferUses as Target 
using (Select * from LockOfferByOfferUses Where OfferCode='abc') as Source 
on Target.OfferID = Source.OfferID 
when NOT MATCHED then 
INSERT (OfferID,OfferCode,LockCounter,UpdatedDate) VALUES (123,'abc',1,GETDATE()) 
when MATCHED then 
update set Target.LockCounter=Target.LockCounter+1; 

.

+0

설명 주셔서 감사합니다, 정말 상황을 이해하는 데 도움 :) – black