Как вставить несколько строк в таблицу «многие ко многим», основываясь на нескольких столбцах в другой таблице? - PullRequest
0 голосов
/ 26 апреля 2018

Я выполняю миграцию данных в новую базу данных с совершенно другой структурой. Использование SQL Server & T-SQL.

Вот пример SQLFiddle моих таблиц и где я дошел до сих пор:
http://sqlfiddle.com/#!18/d179b/1

У меня есть четыре таблицы:

CallNotes

    Id, uniqueidentifier
    OldCallRecordId, int -- Used for migrating only, not in final
    Content, nvarchar(100)

CallTopics

    Id, uniqueidentifier
    Name, nvarchar(50)

CallNoteCallTopics

    CallNoteId, uniqueidentifier
    CallTopicId, uniqueidentifier

OldCallRecords

    Id, int
    CallTopicOne, bit
    CallTopicTwo, bit
    CallTopicThree, bit
    CallTopicFour, bit

Я пытаюсь получить все значения true CallTopic* из OldCallRecords в CallNoteCallTopics.CallTopicId во время оператора INSERT

Все остальные таблицы уже содержат данные.

В настоящее время я пытаюсь использовать оператор CASE, но это только дает мне первое истинное значение, а не то, что я хочу:

INSERT INTO CallNoteCallTopics
    SELECT
        CallNotes.Id,
        CASE
           WHEN OldCallRecords.CallTopicOne = 1 
              THEN (SELECT CallTopics.Id 
                    FROM CallTopics 
                    WHERE CallTopics.Name = 'Call Topic One')
          WHEN OldCallRecords.CallTopicTwo = 1 
             THEN (SELECT CallTopics.Id 
                   FROM CallTopics 
                   WHERE CallTopics.Name = 'Call Topic Two')
          WHEN OldCallRecords.CallTopicThree = 1 
             THEN (SELECT CallTopics.Id 
                   FROM CallTopics 
                   WHERE CallTopics.Name = 'Call Topic Three')
          WHEN OldCallRecords.CallTopicFour = 1 
             THEN (SELECT CallTopics.Id 
                   FROM CallTopics 
                   WHERE CallTopics.Name = 'Call Topic Four')
        END
    FROM 
        OldCallRecords
    LEFT JOIN 
        CallNotes ON CallNotes.OldCallRecordId = OldCallRecords.Id

1 Ответ

0 голосов
/ 26 апреля 2018

Это происходит потому, что, когда один из столбцов-кандидатов совпадет с CASE WHEN, он будет выведен, эта же строка не будет проверена снова.

Вы можете попробовать использовать UNION

INSERT INTO CallNoteCallTopics
 SELECT
   CallNotes.Id
   ,(SELECT CallTopics.Id FROM CallTopics WHERE CallTopics.Name = 'Call Topic One') as CallTopicId
 FROM OldCallRecords
 LEFT JOIN CallNotes
 ON CallNotes.OldCallRecordId = OldCallRecords.Id
 WHERE OldCallRecords.CallTopicOne = 1

UNION 

 SELECT
   CallNotes.Id
   ,(SELECT CallTopics.Id FROM CallTopics WHERE CallTopics.Name = 'Call Topic Two') as CallTopicId
 FROM OldCallRecords
 LEFT JOIN CallNotes
 ON CallNotes.OldCallRecordId = OldCallRecords.Id
 WHERE OldCallRecords.CallTopicTwo = 1

UNION 

 SELECT
   CallNotes.Id
   ,(SELECT CallTopics.Id FROM CallTopics WHERE CallTopics.Name = 'Call Topic Three') as CallTopicId
 FROM OldCallRecords
 LEFT JOIN CallNotes
 ON CallNotes.OldCallRecordId = OldCallRecords.Id
 WHERE OldCallRecords.CallTopicThree = 1

UNION 

 SELECT
   CallNotes.Id
   ,(SELECT CallTopics.Id FROM CallTopics WHERE CallTopics.Name = 'Call Topic Four') as CallTopicId
 FROM OldCallRecords
 LEFT JOIN CallNotes
 ON CallNotes.OldCallRecordId = OldCallRecords.Id
 WHERE OldCallRecords.CallTopicFour = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...