SQL多表更新

时间:2017-12-12 21:18:13

标签: sql sql-server tsql sql-update

我有4张桌子:

ContractedService

CarePackageLineItem

ContractedServiceLevel

合同

他们如下链接:

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

我需要做的是更新所有服务引用,将其作为合同引用的前两个字符的串联,然后是现有的服务引用。

这样的事情:

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

我尝试使用基于上面每个表的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

1 个答案:

答案 0 :(得分:0)

我上面的帖子中的编辑工作正常。

相关问题