2012-02-22 70 views
0

我意識到這是一個荒謬的請求,但我想要做的是將多個記錄連同一些文本文本一起拉回到單個列。Oracle/SQL - 多記錄到一個[字符串聚合]

所以給定一個表像這樣

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

我希望看到回單記錄與一列,例如區域等欄目都很好,但像這樣

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

一列有關如何做到這一點的任何想法?我運行Oracle 9i和在PL/SQL不能做到這一點


好的表格格式已經改變了一點,但這個想法是一樣的

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

所以我發現這個代碼貫通進入鏈接上市

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 

我的想法很簡單就是有內選擇拉從另一個選擇,我做我的商店代碼和STORE_NAME像這樣需要HTML沿CONCAT ......

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

你真的,真的確定你不能在你的應用程序中做到這一點? – 2012-02-23 00:45:43

+0

[在Oracle中快速生成連接字符串的方法]的可能重複(http://stackoverflow.com/questions/7531001/fast-way-to-generate-concatenated-strings-in-oracle) – 2012-02-23 02:59:34

+0

WW。我當然會推動它,但如果我們不能或只是作爲一種學習練習,能夠做到這一點是非常好的。 – dscl 2012-02-23 14:12:21

回答

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和城市。 – 2012-02-23 00:46:26

+0

只是要更難 - 沒有使用wm_concat() – dscl 2012-02-23 15:03:52

+0

@dscl這樣做的任何想法,請注意我不會寬恕這樣做。只是指出它作爲一個解決方案。您應該參加[WW](http://stackoverflow.com/users/14663/ww)評論。正如你在9i我會建議'stragg',我[證明](http://stackoverflow.com/questions/8823509/how-to-concatenate-strings/8825034#8825034)是相同的限制'wm_concat' ,很抱歉...其他方式會更糟。 – Ben 2012-02-23 19:05:43

-3

您可以在Oracle中創建一個聚合函數,參見文檔。

-2

你曾經通過DBMS_XMLGEN發揮各地?

+0

這真的是個答案嗎?它不應該只是一個評論? – Ollie 2012-02-23 11:52:25

+0

你願意我把這個改寫爲「DBMS_XMLGEN會讓你做你想找的東西嗎?」 – 2012-02-23 18:48:42

+0

我不是在批評,只是你寫的是一個評論而不是一個答案。只要提到DBMS_XMLGEN也不會有什麼大的幫助,簡單的解釋具體細節就可以符合恕我直言。 – Ollie 2012-02-23 19:07:48

相關問題