2010-07-08 2 views
0

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

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

То, что я пытаюсь использовать:

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

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

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

ответ

0

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