【问题标题】:Merge statement with a conditional INSERT带有条件 INSERT 的合并语句
【发布时间】:2019-02-21 16:38:18
【问题描述】:

我在合并语句中注意到源表中有 PackageId0 的行。这些记录不应插入到目标表中。所以我想在我的 INSERT 上有这个条件。

MERGE MyTargetTable AS TARGET
USING MySourceTable AS SOURCE
ON (SOURCE.orderidHash = TARGET.Id)
WHEN MATCHED AND (TARGET.CustomerId <> SOURCE.CustomerId
    OR TARGET.PackageId <> SOURCE.packageid
    OR TARGET.TypeId <> SOURCE.ordertypeid
    OR TARGET.Created <> SOURCE.Created
    OR TARGET.Updated <> SOURCE.Changed)
THEN
UPDATE SET TARGET.CustomerId = SOURCE.customeridHash,
     TARGET.PackageId = SOURCE.packageid,
     TARGET.TypeId = SOURCE.ordertypeid,
     TARGET.Created = SOURCE.Created,
     TARGET.Updated = SOURCE.Changed
WHEN NOT MATCHED BY TARGET 
INSERT (
    Id, 
    CustomerId, 
    PackageId,
    TypeId,
    Created, 
    Updated
)
VALUES (
    SOURCE.orderidHash,
    SOURCE.customeridHash,
    SOURCE.packageid,
    SOURCE.ordertypeid,
    SOURCE.Created,
    SOURCE.changed
)
WHEN NOT MATCHED BY SOURCE THEN DELETE;

在上面的声明中我应该在哪里使用WHERE PackageId &lt;&gt; 0?当我将条件放在WHEN NOT MATCHED BY TARGET 之后时,我收到错误消息:

MERGE 语句与 FOREIGN KEY 约束“FK_MyTargetTable_DimCustomer”冲突。冲突发生在数据库 MyDatabase、表 DimCustomer、列 Id 中。

MyTargetTable.CustomerIdDimCustomer.Id 的 FK。

【问题讨论】:

  • 将插入限制为更少的行不可能触发外键错误。你这里还有一个问题。发布完整的错误消息,您将看到哪个 FK 失败了。
  • 您是否尝试过使用单独的语句?这是我对任何遇到MERGE 问题的人的建议(不要介意那些你还不知道的问题)。见this article...
  • @EzLo 我更新了错误消息。显然,与表DimCustomer 存在外键冲突。

标签: sql sql-server tsql merge


【解决方案1】:

只需要改变

USING MySourceTable AS SOURCE
to
using (select * from MySourceTable where  PackageId <> 0) as Source 

【讨论】:

  • 这会产生同样的错误。显然,与表DimCustomer存在外键冲突。
  • 显然,DimCustomer 表没有更新新数据,导致外键冲突。
  • 由于您的观点也有助于合并,请随时更新答案,以便我接受。
  • 可能 MyTargetTable 与 dimcustomer 有 fk 关系。您首先必须使用所有新客户 ID 更新 dimcustor,然后进行合并。我认为更新 TARGET.CustomerId = SOURCE.customeridHash, 可能是一个错误。您使用此列来获取匹配项,我不会更新它。 target.id 和 target.customerid 列是唯一的吗?
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多