2017-07-06 7 views
1

私はMSSQLデータベースのテーブルを埋めるためのステートメントを持っています。セミコロンで区切られたいくつかの値を結合します。MSSQLの 'FOR XML PATH'をOracleに変換

INSERT INTO XXAArcDocSWSB (ArcDocINr, SWorte) 
SELECT A.ArcDocINr, B.SWorte FROM XXAArcDoc A 
LEFT JOIN (
SELECT DISTINCT T2.ArcDocINr, 
SUBSTRING(
    (
     SELECT ';' + T1.SWort AS [text()] 
     FROM (SELECT D.ArcDocINr, SW.SWort FROM XXAArcDoc D, XXAArcSW SW WHERE D.ArcDocINr = SW.ArcDocINr) T1 
     WHERE T1.ArcDocINr = T2.ArcDocINr 
     For XML PATH ('') 
    ), 2, 255) [SWorte] 
FROM (SELECT D.ArcDocINr, SW.SWort FROM XXAArcDoc D, XXAArcSW SW WHERE D.ArcDocINr = SW.ArcDocINr) T2 
) B ON A.ArcDocINr = B.ArcDocINr 

これをOracleに変換するための十分な知識がありません。それは私にMSSQLと同じ出力を与えるはずです。 誰かが私を助けることができますか?

編集:ここでは

は、いくつかのサンプルデータです:

XXAArcDoc:

ArcDocINr | ... 
----------|---------- 
1   | 
2   | 
3   | 
.   | 
.   | 
.   | 

XXAArcSW:

ArcSWINr | ArcDocINr | SWort 
---------|-----------|--------- 
6  | 1   | Müller 
7  | 1   | 100 
8  | 2   | 111111 
9  | 2   | 13579 
10  | 2   | 002 
11  | 3   | TM-AH 

そして、ここでは私の所望の出力です:

ArcDocINr | SWorte 
----------|--------- 
1   | Müller;100 
2   | 111111;13579;002 
3   | TM-AH 
+2

をあなたはLISTAGGを探しています – GurV

+0

いくつかのサンプルデータを表示することをお勧めします。さらに重要なのは、 。 – jeff6times7

+0

@ jeff6times7サンプルデータと希望の出力で更新 –

答えて

1

使用LISTAGG

SELECT ArcDocINr, 
     LISTAGG(
      SWort, 
      ';' 
     ) WITHIN GROUP (ORDER BY ArcSWINr) AS SWorte 
FROM XXAArcSW 
GROUP BY ArcDocINr; 

更新

あなたがXXAArcSWテーブルから値を使用してXXAArcDocテーブルに何かを挿入している場合:

INSERT INTO XXAArcDoc (ArcDocINr, SWorte) 
SELECT ArcDocINr, 
     LISTAGG(SWort, ';') WITHIN GROUP (ORDER BY ArcSWINr) 
FROM XXAArcSW 
GROUP BY ArcDocINr 
+0

これは私にエラーを与えます:テーブルXXAArcSWの不明フィールド[LISTAGG(SWort、 ';')]。しかし、ArcDocINrとLISTAGGを並べ替えるとうまくいきます。 これをInsert-Statementに挿入する例を教えてください。 –

+0

@ F.Baumの例が追加されました。 – MT0