使用FK将数据从一个表合并到另一个表

时间:2010-07-08 09:48:30

标签: sql-server-2008

我必须将一个表中的数据合并到另一个表中。这两个表都具有相同的结构,如下所示:

Id (PK*) | Name | ParetnId (FK to PK*, it's a tree)

我正在尝试使用的内容:

  • 普通插入/更新 - SQL,FK / PK问题太长(当我将带有ParentId的行复制到不存在的行时)
  • 合并运算符 - 更短,但问题相同

我知道有些人临时关闭约束,复制数据并再次限制约束。在我的情况下,我试图避免这种情况。 (许多线程写入这些表,我不知道这些技巧如何影响事务)

问题是:如何在不关闭约束的情况下合并(或仅复制)这些表之间的记录。

1 个答案:

答案 0 :(得分:0)

我可以在源表上使用更多信息。我假设它不会有主键列。如果它也没有外键列,那么我假设你可以加入目标表来获取id(如果是,你可以从下面删除AND EXISTS子句)。唯一的麻烦是你必须多次运行,直到没有更多的插入。

MERGE INTO Target AS T
  USING Source AS S
    ON S.Name = T.Name
  WHEN MATCHED AND EXISTS(
    SELECT *
      FROM Target
      WHERE Id = S.ParentID
    ) THEN
    UPDATE SET
      ParentId = S.ParentID
  WHEN NOT MATCHED BY TARGET AND EXISTS(
    SELECT *
      FROM Target
      WHERE Id = S.ParentID
    ) THEN
    INSERT VALUES(
      S.Name,
      S.ParentID
      )