Слияние данных из одной таблицы в другую с помощью FK - PullRequest
0 голосов
/ 08 июля 2010

Я должен объединить данные из одной таблицы в другую. Обе эти таблицы имеют одинаковую структуру, примерно такую:

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

Что я пытаюсь использовать:

  • Обычная вставка / обновление - слишком длинные проблемы с SQL, FK / PK (когда я копирую строку с ParentId в несуществующую строку)
  • оператор слияния - намного короче, но с такими же проблемами

Я знаю, что некоторые парни временно отключают ограничения, копируют данные и снова включают ограничения. В моем случае я пытаюсь избежать этого. (Многие потоки пишут в эти таблицы, и я не знаю, как такие уловки влияют на транзакции)

Проблема в том, как объединить (или просто скопировать) записи между такими таблицами, не отключая ограничения.

1 Ответ

0 голосов
/ 13 июля 2010

Я мог бы использовать больше информации в исходной таблице.Я предполагаю, что у него не будет столбца первичного ключа.Если у него также нет столбца внешнего ключа, то я предполагаю, что вы можете присоединиться к целевой таблице, чтобы получить идентификатор (если это так, вы можете исключить пункты 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
      )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...