Как я могу объединить значения для каждого отдельного ключа в таблице сопоставлений?

#tsql

#tsql

Вопрос:

Я пытаюсь преобразовать таблицу сопоставлений в объединенную строку XML. По сути, я хочу взять эту таблицу:

 Old_Key      Old_Value
1            'a'
1            'b'
1            'c'
2            'd'
2            'e'
  

И вставьте это так, чтобы значения в col2 были преобразованы в XML-строку для каждого значения в Col1, вот так:

 New_Key New_Value
1       <vals><val>a</val><val>b</val><val>c</val><vals>
2           <vals><val>d</val><val>e</val></vals>
  

Мой текущий код конкатенации:

 INSERT INTO New_Table (New_Key, New_Value)
SELECT DISTINCT(Old_Key), (SELECT Old_Value AS val FROM Old_Table FOR XML PATH(''), ROOT('vals')) FROM Old_Table
  

Этот код не работает, поскольку все Old_Values объединяются вместе. Как я могу убедиться, что только Old_Values, которые используют один и тот же ключ, объединяются вместе? Дайте мне знать, если я могу сделать что-нибудь еще, чтобы прояснить мою ситуацию. Спасибо!

Ответ №1:

Объедините с внешней Old_Table во вложенном запросе и используйте group by вместо distinct .

 select
  O1.Old_Key,
  (select Old_Value as val
   from Old_Table as O2
   where O1.Old_Key = O2.Old_Key
   for xml path(''), root('vals'), type) as Keys  
from Old_Table as O1
group by O1.Old_Key
  

Результат

 Old_Key  Keys
-------  -------------------------------------------------
1        <vals><val>a</val><val>b</val><val>c</val></vals>
2        <vals><val>d</val><val>e</val></vals>