2017-12-12 17 views
0

を更新SQLマルチ表Iは、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文字を連結し、その後に既存のサービス参照を続けて更新することです。このような

何か:私は、個々のテーブルの上のselect文に基づいて、この使用して定期的な更新を実行しようとしました

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

は、しかし、同じサービスrefのものすべてをもたらしたこと。私がフラットな更新を行うことができないのは、彼らが属する契約に基づいて、サービスの複製を複製する必要があるからです(コピーは有効ですが、ETLは分割されません)。

答えはCTEを使用することですが、私はこれらのこととそれらを実装する方法にはかなり慣れていません。ここでの主なことは、参照整合性がテーブルの下に保持される必要があります。

助けてください。

EDIT:

私は(基本的な質問には影響しないだろうが)テーブルの参加私の最初にミスを犯しているように見えます。私はこれに非常に工学的な解決策を思いついた:

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

正確には – Archeon

+0

のMSSQL、2014となります。最後の 'update'では、' ON UP.CPLIRef = CPLI.CarePackageLineItemRef WHERE UP.CPLIRef = CPLI.CarePackageLineItemRef'は冗長です。 – HABO

+0

ありがとう、私もそれに気づいた、実際にそれを貼り付けた後に削除しました。 – Archeon

答えて

0

私の上記の投稿の編集は、必要に応じて動作しました。

関連する問題