2012-02-28 5 views
0

行の2つの行の値を選択して連結したいとします。DB2の行の2つの行の値を選択する方法

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

これは見苦しいように見えるかもしれませんが、一般的に答えは実際には 'don't'です。表示上の理由からそれを行う場合は、アプリケーションでその処理を行います。データの理由からデータを作成したい場合は、データを正規化された1:多くの関係として保持し、その形式でデータを処理する方法を検討してください(扱っているユースケースを投稿すると役に立ちます)。しかし、複数の値を1つの値に縮退するのは、一般的にSQL Anti-Patternであり、将来の痛みは価値があるものよりも多くなります。 – MatBailie

+0

@Demsあなたは正しいです。その理由は、シェフのアドホックなリクエストです。 – Kayser

+2

[DB2のクエリから区切られた文字列を作成する]の複製が可能です(http://stackoverflow.com/questions/3728010/create-a-delimitted-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を置き換えることができます元のテーブルへの参照。

関連する問題