Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle/SQL-将多个记录合并为一个[字符串聚合]_Sql_Oracle_Oracle9i_String Aggregation - Fatal编程技术网

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。