0
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
正確には – Archeon
のMSSQL、2014となります。最後の 'update'では、' ON UP.CPLIRef = CPLI.CarePackageLineItemRef WHERE UP.CPLIRef = CPLI.CarePackageLineItemRef'は冗長です。 – HABO
ありがとう、私もそれに気づいた、実際にそれを貼り付けた後に削除しました。 – Archeon