2017-12-12 11 views
0

를 업데이트SQL 멀티 표 4 개 테이블이

select * FROM migrate.ContractedServiceLevel CSL 
JOIN migrate.CarePackageLineItem CPLI 
ON CSL.ServiceLevel = CPLI.ServiceLevel 
JOIN migrate.ContractedService CS 
ON CSL.ServiceRef = CS.ServiceRef 
JOIN Migrate.Contract CON 
ON CON.ContractRef = CS.ContractRef 

내가해야 할 일은 모든 서비스 참조를 계약 참조의 처음 2 자와 연결하고 기존 서비스 참조를 연결하는 것입니다. 이 같은

뭔가 :

SET ServiceRef = LEFT(con.ContractRef,2) + CS.ServiceRef 

나는 동일한 서비스 REF되는 모든 결과가 있지만, 각각의 테이블 위의 select 문에 따라이 사용하여 정기적으로 업데이트를 수행했습니다. 내가 평평한 업데이트를 할 수없는 이유는 그들이 속한 계약에 따라 서비스 복제본 (복제본은 유효하지만 내 ETL이 아니므로 분할)을 분할해야하기 때문입니다.

답변은 CTE를 사용하는 것이 확실하지만, 이것들과 구현 방법에 대해서는 거의 익숙하지 않습니다. 여기서 중요한 것은 참조 무결성이 테이블 아래로 유지되어야한다는 것입니다.

도움을 주시면 감사하겠습니다.

편집 : (기본 문제에 영향을주지 않습니다하지만)

내가 테이블의 결합 내 초기에 실수를 한 것 같다. 나는이에 매우 이상 설계된 솔루션으로 올라와있다 : 원하는대로 내 위의 게시물에

CREATE TABLE #ServiceRefUpdate 
(
CSLServiceRef varchar(100), 
CSLID int, 
CSServiceRef varchar(100), 
CSID int, 
ContractRef varchar(100), 
ContractID int, 
CPLIServiceRef varchar(100), 
CPLIRef varchar(100), 
) 

INSERT INTO #ServiceRefUpdate 
SELECT CSL.ServiceRef, CSL.RecordId, CS.ServiceRef, CS.RecordId,    
CON.ContractRef, CON.RecordId, CPLI.ServiceRef, CPLI.CarePackageLineItemRef 
FROM migrate.ContractedServiceLevel CSL 
JOIN migrate.ContractedService CS 
ON CSL.ServiceRef = CS.ServiceRef 
JOIN Migrate.CarePackageLineItem CPLI 
ON CPLI.ServiceRef = CS.ServiceRef 
AND CPLI.ServiceLevel = CSL.ServiceLevel 
JOIN Migrate.Contract CON 
ON CON.ContractRef = CS.ContractRef 
JOIN migrate.ContractStructure CONS 
ON CPLI.ServiceLevel = CONS.ServiceLevel 
AND CON.ContractType = CONS.ContractType 

UPDATE #ServiceRefUpdate 
SET CSLServiceRef = LEFT(ContractRef, 2) + CSLServiceRef, 
CSServiceRef = LEFT(ContractRef, 2) + CSServiceRef, 
CPLIServiceRef = LEFT(ContractRef, 2) + CPLIServiceRef 

UPDATE migrate.ContractedServiceLevel SET ServiceRef = UP.CSLServiceRef 
FROM migrate.ContractedServiceLevel CSL 
JOIN #ServiceRefUpdate UP 
ON UP.CSLID = CSL.RecordId 


UPDATE migrate.ContractedService SET ServiceRef = UP.CSServiceRef 
FROM migrate.ContractedService CS 
JOIN #ServiceRefUpdate UP 
ON UP.CSID = CS.RecordId 


UPDATE migrate.CarePackageLineItem SET ServiceRef = UP.CPLIServiceRef 
FROM migrate.CarePackageLineItem CPLI 
JOIN #ServiceRefUpdate UP 
ON UP.CPLIRef = CPLI.CarePackageLineItemRef 
WHERE UP.CPLIRef = CPLI.CarePackageLineItemRef 

DROP TABLE #ServiceRefUpdate 
+0

Apologies, MSSQL, 2014는 정확히 – Archeon

+0

입니다. 마지막 'update'에서 : 'ON UP.CPLIRef = CPLI.CarePackageLineItemRef WHERE UP.CPLIRef = CPLI.CarePackageLineItemRef'는 중복됩니다. – HABO

+0

고마워, 나는 이것을 또한 붙인 후에 실제로 그것을 제거하고 실제로 그것을 발견했다. – Archeon

답변