我有两个表CourtCase
和CaseResult
。 CaseResult
包含引用CourtCaseID
表的外键CourtCase
。
表CourtCase
包含字段CompleteDate
。我想将CompleteDate
从CourtCase
表迁移到CaseResult
表。
我提出的用于迁移数据的查询:
UPDATE CaseResult
SET CaseResult.CompleteDate = CourtCase.CompleteDate
FROM CourtCase, CaseResult
WHERE CourtCase.CourtCaseID = CaseResult.CourtCaseID
问题是,并非每个CourtCase
在CaseResult
中都有一个条目,只有一些是。因此,我将需要针对上述查询存在的情况移动日期,还要为不存在的情况在CaseResult
中创建条目,并插入外键CourtCaseID
和CompleteDate
。
您可以分为两个部分,首先更新现有记录,然后创建新记录。我也鼓励您使用适当的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)
您也可以通过将任务重新考虑为“我要从CourtCase插入具有CompleteDate的所有行。对于CaseResult中已经存在的行,我只想更新CompleteDate,来实现这一点”
相当于:
INSERT INTO CaseResult
SELECT CourtCaseID, CompleteDate
FROM CourtCase
WHERE NOT ISNULL(CompleteDate)
ON DUPLICATE KEY UPDATE CaseResult.CompleteDate = CourtCase.CompleteDate;
在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
部分。