将数据从一个表移动到另一个表,同时在不存在相应行的情况下创建条目

问题描述 投票:0回答:3

我有两个表CourtCaseCaseResultCaseResult包含引用CourtCaseID表的外键CourtCase

CourtCase包含字段CompleteDate。我想将CompleteDateCourtCase表迁移到CaseResult表。

我提出的用于迁移数据的查询:

UPDATE CaseResult 
SET CaseResult.CompleteDate = CourtCase.CompleteDate 
FROM CourtCase, CaseResult 
WHERE CourtCase.CourtCaseID = CaseResult.CourtCaseID

问题是,并非每个CourtCaseCaseResult中都有一个条目,只有一些是。因此,我将需要针对上述查询存在的情况移动日期,还要为不存在的情况在CaseResult中创建条目,并插入外键CourtCaseIDCompleteDate

sql sql-server tsql sql-update sql-insert
3个回答
0
投票

您可以分为两个部分,首先更新现有记录,然后创建新记录。我也鼓励您使用适当的JOIN。

UPDATE CaseResult 
SET CaseResult.CompleteDate = CourtCase.CompleteDate 
FROM CourtCase
     INNER JOIN CaseResult ON CourtCase.CourtCaseID = CaseResult.CourtCaseID

INSERT INTO CaseResult (CourtCaseID, CompleteDate)
       SELECT CourtCaseID, CompleteDate 
       FROM CourtCase
       WHERE NOT EXISTS (SELECT * FROM CaseResult WHERE CaseResult.CourtCaseID = CourtCase.CourtCaseID)

0
投票

您也可以通过将任务重新考虑为“我要从CourtCase插入具有CompleteDate的所有行。对于CaseResult中已经存在的行,我只想更新CompleteDate,来实现这一点”

相当于:

INSERT INTO CaseResult
SELECT CourtCaseID, CompleteDate
FROM CourtCase
WHERE NOT ISNULL(CompleteDate)
ON DUPLICATE KEY UPDATE CaseResult.CompleteDate = CourtCase.CompleteDate;

0
投票

在SQL Server中,您可以使用the MERGE syntax在单个语句中完成此操作,该语句实现“更新或插入”逻辑,也称为upsert

MERGE

您没有告诉表中所有可用的列。假设只有两个列merge CaseResults cr using CourtCase cc on (cr.CourtCaseID = cc.CourtCaseID) when matched then update set cr.CompleteDate = cc.CompleteDate when not matched by target then insert (CourtCaseID, CompleteDate) values(cc.CourtCaseID, cc.CompleteDate) CourtCaseID。您可能需要根据您的实际架构,用更多的列来调整CompleteDate部分。

© www.soinside.com 2019 - 2024. All rights reserved.