将数据从一个表移动到另一个表,同时在不存在相应行时创建条目
Posted
技术标签:
【中文标题】将数据从一个表移动到另一个表,同时在不存在相应行时创建条目【英文标题】:Moving data from one table to another while also creating entries when no corresponding row exists 【发布时间】:2020-06-15 07:12:10 【问题描述】:我有两张桌子CourtCase
和CaseResult
。 CaseResult
包含引用 CourtCase
表的外键 CourtCaseID
。
表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
.
【问题讨论】:
【参考方案1】:在 SQL Server 中,您可以在单个语句中执行此操作,使用 the MERGE
syntax,它实现“更新或插入”逻辑,也称为 upsert:
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
。您可能需要根据您的实际架构调整 insert
部分的更多列。
【讨论】:
【参考方案2】:您可以分两步进行,首先更新现有记录,然后创建新记录。我还鼓励您使用正确的 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)
【讨论】:
【参考方案3】:您想使用 MERGE 来实现您的目标:这允许您定义您想要在 CourtCase 中找到的每一行要在 CaseResult 中表示的每一行。 一个粗略的例子:
MERGE CaseResult AS r
USING CourtCase AS c
ON (r.CourtCaseID = c.CourtCaseID)
WHEN NOT MATCHED BY CaseResult
THEN INSERT (CourtCaseID, CompleteDate) VALUES (c.CourtCaseID, c.CompleteDate)
WHEN MATCHED
THEN UPDATE SET r.CompleteDate = c.CompleteDate
;
有关详细信息,请参阅 https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/bb522522(v=sql.100)?redirectedfrom=MSDN 或 https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/bb510625%28v%3dsql.100%29 下的 MERGE。
(删除了较早的 mysql 答案)
【讨论】:
您能否指出tsql
中on duplicate key update
的文档?我认为这是mysql
的功能。
感谢指向 tsql 的指针。我之前没能识别出特定的 sql 方言。我根据我的知识调整了答案。以上是关于将数据从一个表移动到另一个表,同时在不存在相应行时创建条目的主要内容,如果未能解决你的问题,请参考以下文章
PLSQL:将数据从一个表中插入可能的环境到另一个表,同时保持 from_table 名称动态
如何编写 SQL 命令将所有旧数据从访问表移动到另一个数据库/表?
Laravel 将数据从一个表移动到另一个表并删除数据来自的列?
如何将数据从一个表移动到另一个表并更新外键 (T-SQL 2008)