【发布时间】:2017-12-12 21:18:13
【问题描述】:
我有 4 张桌子:
合约服务
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
我需要做的是更新所有服务引用,将合同引用的前 2 个字符连接起来,然后是现有的服务引用。
类似这样的:
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
【问题讨论】:
-
道歉,MSSQL,确切地说是 2014 年
-
在最后一个
update:ON UP.CPLIRef = CPLI.CarePackageLineItemRef WHERE UP.CPLIRef = CPLI.CarePackageLineItemRef是多余的。 -
谢谢,我也注意到了这一点,并且在我粘贴后确实删除了它。
标签: sql sql-server tsql sql-update