2012-02-22 12 views
0

これはうそつきの要求ですが、私がしようとしているのは、複数のレコードを単一の列に戻して、Oracle/SQL - 複数のレコードを1つにまとめる[文字列集約]

は、だから私は、カラム、地域などの他の列は、罰金ですが、この

<option value="1234">Chicago</option><option value="567">Palatine</option><option value="234">Algonquin</option><option value="987">Wauconda</option> 

のような単一の列に戻って単一のレコードを見たいのですが、この

REGION CITY SID 
------------------- 
1 Chicago  1234 
1 Palatine 567 
1 Algonquin 234 
1 Wauconda 987 

のような表を与えられましたどのようにこれを行うにはどのような考え?私は、だから私はこのコードを介さ見つけオーケー表形式が少し変更されていますが、考え方は同じ

COUNTRY STORECODE STORE_NAME 
------------------------------ 
USA  1234  Chicago 
USA  567   Palatine 
CAN  987   Toronto 

ある


をオラクル9iのを実行していることだし、PL/SQLでこれを行うことはできませんリンクは

SELECT COUNTRY, 
     LTRIM(MAX(SYS_CONNECT_BY_PATH(STORECODE,',')) 
     KEEP (DENSE_RANK LAST ORDER BY curr),',') AS COUNTRY_HTML 
FROM (SELECT COUNTRY, 
       STORECODE, 
       ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY STORECODE) AS curr, 
       ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY STORECODE) -1 AS prev 
     FROM tablename) 
GROUP BY COUNTRY 
CONNECT BY prev = PRIOR curr AND COUNTRY = PRIOR COUNTRY 
START WITH curr = 1; 

を記載されていると私はそれを実行したとき、私はこの出力を見る

COUNTRY COUNTRY_HTML 
-------------------- 
USA  1234,567 
CAN  987 

私の考えから別の内側の選択プルを持っているだけでだった私は、このように必要なHTMLと一緒にストアコードとSTORE_NAMEの私の連結を行う場所を選択...

SELECT COUNTRY, 
     LTRIM(MAX(SYS_CONNECT_BY_PATH(RECORD_HTML,',')) 
     KEEP (DENSE_RANK LAST ORDER BY curr),',') AS COUNTRY_HTML 
FROM (SELECT COUNTRY, 
       RECORD_HTML, 
       ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY RECORD_HTML) AS curr, 
       ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY RECORD_HTML) -1 AS prev 
     FROM (SELECT COUNTRY, '<option value="' || STORECODE || '">' || STORE_NAME || '</option>' AS RECORD_HTML FROM tablename)) 
GROUP BY COUNTRY 
CONNECT BY prev = PRIOR curr AND COUNTRY = PRIOR COUNTRY 
START WITH curr = 1; 

私たちのフロントエンド環境が受け入れるんがクエリで結果を確認しようとするとエラーが表示されます:リソースが無効です。表示する前に、クエリを修正する必要があります。

エラーはおそらく役に立ちませんが、なぜ私のバージョンが機能していないのでしょうか?

ありがとうございます!

+0

あなたのアプリケーションでこれを実行できないと本当に本当にありますか? –

+0

[Oracleで連結文字列を生成するための高速な方法]の複製が可能です(http://stackoverflow.com/questions/7531001/fast-way-to-generate-concatenated-strings-in-oracle) –

+0

WW。私は確かにそれを推進しようとしていますが、私たちが学習の練習としてやっていけない場合、それを行うことができれば幸いです。 – dscl

答えて

3

それは嫌だが、あなたはこのような何かを行うことができます:

select replace(blah2,',','') 
    from (select wm_concat(blah) as blah2 
      from (select '<option value="' || sid || '">' || city || '</option>' as blah 
        from my_table 
         ) 
       ) 
+1

私はあなたがうんざりしていると言いましたが、XMLにも影響されます。このアプローチをとるには、XMLエスケープSIDと都市が必要です。 –

+0

ちょっと難しいのですが、wm_concat()を使わずにこれをやっていると思ったら – dscl

+0

@ dsclしてください。ただそれを解決策として指摘してください。 [WW's](http://stackoverflow.com/users/14663/ww)のコメントを取るべきです。あなたが9i上にいるので、私は 'stragg'を提案しています。これは' wm_concat'に同じように制限されています(http://stackoverflow.com/questions/8823509/how-to-concatenate-strings/8825034#8825034)。 、申し訳ありません...他の方法は悪いです。 – Ben

-3

Oracleでは集計関数を作成できます(ドキュメントを参照)。

-2

あなたはDBMS_XMLGENの周り果たしていますか?

+0

これは本当に答えですか?ただのコメントではないでしょうか? – Ollie

+0

「DBMS_XMLGENはあなたが探していることをさせるでしょう」と言い返したいのですか? –

+0

私は批判していない、ちょうどあなたが書いたことは、ひどい答えよりもコメントであるということです。 DBMS_XMLGENについて言及するだけではあまり役に立ちませんが、詳細についての簡単な説明はIMHOの資格を与えます。 – Ollie

関連する問題