От списка через запятую до отдельного набора результатов. * MySQL - PullRequest
0 голосов
/ 06 мая 2010

Я делаю некоторую миграцию данных из ужасно спроектированной базы данных в менее ужасно спроектированную базу данных. Существует отношение «многие ко многим», у которого первичный ключ в одной таблице соответствует списку через запятую в другой.

FK_ID | data
-------------
1,2   | foo
3     | bar
1,3,2 | blarg

Есть ли способ вывести поле FK_ID с каждым разделенным запятыми элементом в виде одной строки в наборе результатов?

result set
FK_ID | data
-------------
1     | foo
2     | foo
3     | bar
1     | blarg
2     | blarg
3     | blarg

Я думаю, что для этого потребуется какой-то рекурсивный запрос, который, как мне кажется, не имеет mysql.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 мая 2010

Если у вас есть таблица Numbers / Tally, представляющая собой таблицу с последовательным списком целых чисел, вы можете сделать это за один запрос.

Select Substring(T.FK_ID
   , N.Value
   , CharIndex(',', T.FK_ID + ',', N.Value) - N.Value)
  , T.Data
From Numbers As N
 Cross Join Table As T
Where N.Value <= Len(T.FK_ID)
 And Substring(',' + T.FK_ID, N.Value, 1) = ','
0 голосов
/ 06 мая 2010

Для меня самый простой способ сделать это - написать скрипт, который запрашивает исходную таблицу и вставляет записи в целевую таблицу.

псевдокод:

query = "select * from sourcetable";
get a reader object;
while reading()
{
    orig_FK = reader(FK_ID);
    orig_data = reader(data);
    orig_FK_array = orig_FK split by comma
    foreach(ID in orig_FK_array)
    {
        query = "insert into targettable (ID, data) values (@ID, @Data);";
        add parameters;
        execute query;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...