2017-02-06 3 views
1

テーブルAからデータを選択し、同じインデックスを持つのすべてを連結し、連結結果をテーブルBに更新する方法が必要ですインデックス1で、表B.特定のインデックスを使用してデータを連結し、2番目のテーブルを更新する方法

Table A 
+-----------+------+-------+ 
| Type  | Name | Index | 
+-----------+------+-------+ 
| Cake  | A | 1  | 
+-----------+------+-------+ 
| Cookies | B | 1  | 
+-----------+------+-------+ 
| Ice Cream | C | 1  | 
+-----------+------+-------+ 
| Patatoes | D | 1  | 
+-----------+------+-------+ 
| Cake  | E | 2  | 
+-----------+------+-------+ 
| Cookies | F | 2  | 
+-----------+------+-------+ 
| Ice Cream | G | 2  | 
+-----------+------+-------+ 
| Patatoes | H | 2  | 
+-----------+------+-------+ 

のインデックス1行でファイナルテーブルは次のようになります。

Table B 
+-------+---------------------------------------------+ 
| Index | Line          | 
+-------+---------------------------------------------+ 
| 1  | Cake A ; Cookies B; Ice Cream C, Patatoes D | 
+-------+---------------------------------------------+ 
| 2  | Cake E ; Cookies F; Ice Cream G, Patatoes H | 
+-------+---------------------------------------------+ 

あなたは私を助けてくださいことはできますか? おかげで、あなたの期待出力にコンマの代わりにセミコロンを置くためのものと仮定すると、

+1

どのバージョンのOracleですか? 11g以上の場合は、ドキュメントの 'listagg'関数を参照してください。このサイトには多くの例があります。あなたが立ち往生した場合、あなたが試したことと何が間違っていたかを教えてください。 (以前のバージョンの場合は、ここにいくつかのアイデアがあります(https://oracle-base.com/articles/misc/string-aggregation-techniques))。 –

答えて

1

、あなたがlistaggを使用することができます。

select 
    "Index", 
    listagg(Type ||' '||Name, ', ') within group (order by Name) Line 
from table_a 
group by "Index"; 

table_bのアップデートを行うには、あなたがmergeを使用することができます。

merge into table_b b 
using (
    select 
     "Index", 
     listagg(Type ||' '||Name, ', ') within group (order by Name) Line 
    from table_a 
    group by "Index" 
) a on (
    b."Index" = a."Index" 
) 
when matched then update 
set b.Line = a.Line; 
+0

選択はうまく動作します。しかし、私はどのように更新後に行うのですか?この選択は、私が持っているインデックスと同じくらいの行を与えます。私はサイクルを作る必要がありますか? – UcanDoIt

+0

@UcanDoIt - アップデートをご覧ください。 – GurV

+0

これは完全に機能します。あなたはどうやってこれでいいの?私はどこで練習してこの良いことをすることができますか?私を教えてくれますか? – UcanDoIt

0

上記のアプローチからの変形です。ここでは、インデックスに基づいて値を連結するWM_CONCAT関数を使用しています。 注:WM_CONCATはOracleの文書化されていない関数なので、オブジェクトがデータベースに存在しない場合は機能しない可能性があります。 これも役立ちます。

select idx, 
    wmsys.wm_concat(Typ) line -- This is Oracle undocumented function so may not work if this object not present in database 
FROM 
    (SELECT 'Cake' typ,'A' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'B' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'C' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'D' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'E' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'F' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'G' name,2 idx FROM dual 
) 
GROUP BY idx; 


MERGE INTO TABLEB USING 
(SELECT idx, 
    wmsys.wm_concat(Typ) line 
FROM 
    (SELECT 'Cake' typ,'A' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'B' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'C' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'D' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'E' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'F' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'G' name,2 idx FROM dual 
) 
GROUP BY idx 
)a ON (a.idx = tableb.idx) 
WHEN matched THEN 
    UPDATE SET tableb.line = a.line; 
関連する問題