2017-05-29 12 views
-3

データベースのテーブルには列a、b、cがあります。私は、次の操作のためにこれらのペアを取得して保存する必要があります。 私は休止状態を使用しています(ただし、条件インタフェースはありません)。 最適なソリューションは何ですか?行のすべてのフィールドを選択して1つの列に基づいてグループ化します

人エンティティ:

+--------------+----+-------+---+ 
| person Object| a |b  | c | 
+--------------+----+-------+---+ 
|  p1  | w | d  | 1 | 
|  p2  | d | d  | 2 | 
|  p3  | f | e  | 3 | 
|  p4  | x | f  | 1 | 
|  p5  | w | g  | 2 | 
|  p6  | g | s  | 3 | 
|  p7  | x | h  |null| 
|  p8  | q | null | 4 | 
|  p9  | w | null |null| 

期待出力: 同じ "C" と対列のリスト:[{P1、P4}、{P2、P5}、{P3、P6}]

p1は、文字列または列ではなく、エンティティからhibernateオブジェクトを取得します。 p1は1行目のオブジェクトです。私は休止状態のオブジェクト、行のペアのペアを取得したい。

+1

あなたの質問は、データと出力が必要ないくつかの例を挙げています。 – Ramki

+0

@Ramki私は自分の投稿を編集しました。ありがとうございました – faraa

+1

あなたはLISTAGG()を試すことができますこれは複数を与えるでしょう 行の値int単一列の検索インターネットのいくつかの例https://www.techonthenet.com/oracle/functions/listagg.php – Ramki

答えて

0
with data (rn, person, a, b, c) as 
(
    select rownum rn, t.* from 
    (
    select  'p1',   'w' , 'd'  , 1 from dual union all 
    select  'p2',   'd' , 'd'  , 2 from dual union all 
    select  'p3',   'f' , 'e'  , 3 from dual union all 
    select  'p4',   'x' , 'f'  , 1 from dual union all 
    select  'p5',   'w' , 'g'  , 2 from dual union all 
    select  'p6',   'g' , 's'  , 3 from dual union all 
    select  'p7',   'x' , 'h'  , null from dual union all 
    select  'p8',   'q' , null , 4 from dual union all 
    select  'p9',   'w' , null , null from dual 
    ) t 
) 
, 
cte (rn, person, a, b, c, pair) as 
(
    select rn, person, a, b, c, null from data 
    union all 
    select data.rn, null, null, null, null, '{' || cte.person || ',' || data.person || '}' from cte join data on (cte.c = data.c and cte.rn < data.rn) 
) 
select 
    '"C":' || 
    '[' || listagg(pair, ',') within group(order by rn) || ']' result 
from cte 
where pair is not null; 
+0

申し訳ありません。私の入力は明確ではないと思います... p1をエンティティから文字列と列ではなく、取得したハイバネートオブジェクトとみなしました。 p1は最初の行のオブジェクトです – faraa

関連する問題