Oracle/SQL - 多记录到一个[字符串聚合]

问题描述:

我意识到这是一个荒谬的请求,但我想要做的是将多个记录连同一些文本文本一起拉回到单个列。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://*.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

这是令人厌恶的,但你可以做这样的事情:

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://*.com/users/14663/ww)评论。正如你在9i我会建议'stragg',我[证明](http://*.com/questions/8823509/how-to-concatenate-strings/8825034#8825034)是相同的限制'wm_concat' ,很抱歉...其他方式会更糟。 – Ben 2012-02-23 19:05:43

您可以在Oracle中创建一个聚合函数,参见文档。

你曾经通过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