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

Posted

技术标签:

【中文标题】将数据从一个表移动到另一个表,同时在不存在相应行时创建条目【英文标题】:Moving data from one table to another while also creating entries when no corresponding row exists 【发布时间】:2020-06-15 07:12:10 【问题描述】:

我有两张桌子CourtCaseCaseResultCaseResult 包含引用 CourtCase 表的外键 CourtCaseID

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

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

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

问题是不是每个CourtCaseCaseResult 中都有一个条目,只有一些有。因此,我需要通过上述查询移动存在案例的日期,但还要为不存在的案例创建 CaseResult 中的条目,并插入外键 CourtCaseIDCompleteDate .

【问题讨论】:

【参考方案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)

您没有告诉表格中所有可用的列。这假设只有两个列,CourtCaseIDCompleteDate。您可能需要根据您的实际架构调整 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 答案

【讨论】:

您能否指出tsqlon duplicate key update 的文档?我认为这是mysql 的功能。 感谢指向 tsql 的指针。我之前没能识别出特定的 sql 方言。我根据我的知识调整了答案。

以上是关于将数据从一个表移动到另一个表,同时在不存在相应行时创建条目的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL:将数据从一个表中插入可能的环境到另一个表,同时保持 from_table 名称动态

如何编写 SQL 命令将所有旧数据从访问表移动到另一个数据库/表?

Laravel 将数据从一个表移动到另一个表并删除数据来自的列?

如何将数据从一个表移动到另一个表并更新外键 (T-SQL 2008)

SQL Server 2008 查询将表数据从一个移动到另一个

SQL 将某些数据从一个表插入到另一个表