2012-02-28 1 views
0

Я хочу выбрать два значения строк в строке и объединить.Как выбрать два значения строк в строке в DB2

id  value 
------------ 
1  abc 
1  def 
2  ghi 
3  jkl 
3  mno 
3  prs 

Результат должен выглядеть следующим образом:

id  value 
------------ 
1  abc, def 
2  ghi 
3  jkl, mno, prs 

Как я могу это сделать?

+1

Это может показаться легкомысленным, но, как правило, ответ на самом деле «не стоит». Если вы хотите сделать это по причинам показа, выполните эту обработку в своем приложении. Если вы хотите сделать это по причинам данных, сохраните данные как нормализованные отношения 1: многие и рассмотрите способы их обработки в этом формате (мы можем помочь с этим, если вы разместите прецедент, с которым имеете дело). Но сжатие нескольких значений в одном значении, как правило, является анти-шаблоном SQL, который вызывает больше боли в будущем, чем того стоит. – MatBailie

+0

@Dems Вы правы. Причина заключается в специальном запросе шеф-повара. – Kayser

+2

Возможный дубликат [Создать строку с разделителем из запроса в DB2] (http://stackoverflow.com/questions/3728010/create-a-delimited-string-from-a-query-in-db2) – MatBailie

ответ

0

Ссылка @Dems размещена функционально идентична вашим требованиям.

Однако, в случае, если у вас нет доступа к функциям XML, здесь рекурсивный версия CTE:

WITH Indexed(id, value, index) 
      as (SELECT id, value, ROW_NUMBER() OVER(PARTITION BY id ORDER BY value) 
       FROM ValueTable), 
    Concatenated(id, index, concatenated) 
       as (SELECT id, index, value 
        FROM Indexed 
        WHERE index = 1 
        UNION ALL 
        SELECT a.id, a.index + 1, a.concatenated || ', ' || b.value 
        FROM Concatenated as a 
        JOIN Indexed as b 
        ON b.id = a.id 
        AND b.index = a.index + 1) 
SELECT a.id, a.value 
FROM Concatenated as a 
EXCEPTION JOIN Indexed as b 
ON b.id = a.id 
AND b.index > a.index 

Если у вас есть уникальный индекс исходной таблицы, Indexed CTE может быть заменен ссылка на исходную таблицу.

Смежные вопросы