Oracle/SQL-将多个记录合并为一个[字符串聚合]
我意识到这是一个荒谬的请求,但我试图做的是将多条记录与一些文字文本一起拉回到一列中 给我一张这样的桌子Oracle/SQL-将多个记录合并为一个[字符串聚合],sql,oracle,oracle9i,string-aggregation,Sql,Oracle,Oracle9i,String Aggregation,我意识到这是一个荒谬的请求,但我试图做的是将多条记录与一些文字文本一起拉回到一列中 给我一张这样的桌子 REGION CITY SID ------------------- 1 Chicago 1234 1 Palatine 567 1 Algonquin 234 1 Wauconda 987 <option value="1234">Chicago</option><option value="567">P
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>
我希望返回一个带有列的单记录,其他列(如region)也可以,但这样的单列
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>
因此,我通过列出的链接找到了这段代码
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
我的想法很简单,就是从另一个select中提取内部select,在这里我对STORECODE进行解析,并将_名称与所需的html一起存储,如下所示
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;
当我尝试查看结果时,我们的前端环境确实接受查询,但我得到一个错误:资源无效。在查看之前,您可能需要重新创建一个或多个修复查询
我知道这个错误可能没有什么帮助,但是你知道为什么我的版本不起作用吗
谢谢 您可以在Oracle中创建聚合函数,请参阅文档。这很恶心,但您可以这样做:
select replace(blah2,',','')
from ( select wm_concat(blah) as blah2
from ( select '<option value="' || sid || '">' || city || '</option>' as blah
from my_table
)
)
你玩过DBMS_XMLGEN吗?你真的真的确定你不能在你的应用程序中这么做吗?可能是WW的重复。我当然会推动它,但如果我们不能,或者仅仅作为一个学习练习,能够做到这一点就太好了。我知道你说这很恶心,但它也会受到XML注入的影响。如果采用这种方法,您需要对sid和city进行XML转义。更困难的是,您有没有想过在不使用wm的情况下这样做_concat@dscl,请注意,我不宽恕这样做。只是指出这是一个解决办法。你应该在董事会上发表评论。既然你在9i上,我建议你使用stragg,我同样只限于wm_concat,很抱歉。。。其他方法会更糟。这真的是一个答案吗?这不应该只是一个评论吗?你希望我重新编写这个,因为DBMS_XMLGEN会让你做你想做的事吗?我不是在批评,只是你写的更多的是一个评论,而不是一个简洁的答案。仅仅提到DBMS_XMLGEN也没有多大帮助,对细节的简要解释将有助于IMHO。