Представьте себе следующий (очень плохой) дизайн таблицы в MSSQL2008R2:
Table "Posts":
| Id (PK, int) | DatasourceId (PK, int) | QuotedPostIds (nvarchar(255)) | [...]
| 1 | 1 | | [...]
| 2 | 1 | 1 | [...]
| 2 | 2 | 1 | [...]
[...]
| 102322 | 2 | 123;45345;4356;76757 | [...]
Итак, столбец QuotedPostIds содержит разделенный точками с запятой список самоссылающихся PostIds (дети, не делайте этого дома!). Поскольку этот дизайн ужасен, я бы хотел извлечь значения из таблицы QuotedPostIds в новую таблицу отношений n: m, например:
Desired new table "QuotedPosts":
| QuotingPostId (int) | QuotedPostId (int) | DatasourceId (int) |
| 2 | 1 | 1 |
| 2 | 1 | 2 |
[...]
| 102322 | 123 | 2 |
| 102322 | 45345 | 2 |
| 102322 | 4356 | 2 |
| 102322 | 76757 | 2 |
Первичным ключом для этой таблицы может быть либо комбинация QuotingPostId, QuotedPostId и DatasourceID, либо дополнительный искусственный ключ, сгенерированный базой данных.
Стоит отметить, что текущая таблица сообщений содержит около 6 300 000 строк, но только около 285 000 из них имеют значение, установленное в столбце QuotedPostIds. Поэтому может быть хорошей идеей предварительно отфильтровать эти строки. В любом случае, я бы хотел выполнить нормализацию, используя только внутреннюю функциональность MSSQL, если это возможно.
Я уже читал другие посты по этой теме, которые в основном касались функций разделения, но я также не смог выяснить, как именно создать новую таблицу, а также скопировать соответствующее значение из столбца источника данных, или как отфильтровать строки, чтобы они касались соответствующим образом. ,
Спасибо!
€ dit: Я все продумал и наконец решил проблему, используя внешнюю программу на C # вместо внутренней функциональности MSSQL. Поскольку, похоже, это можно было сделать по предложению Микаэля Эрикссона, я отмечу его пост как ответ.