sql - 将 MSSQL 'FOR XML PATH' 转换为 Oracle

标签 sql sql-server oracle code-conversion for-xml-path

我有一个语句来填充我的 MSSQL 数据库上的一个表。它将一些值连接在一起,用分号分隔。

INSERT INTO XXAArcDocSWSB (ArcDocINr, SWorte)
SELECT A.ArcDocINr, B.SWorte FROM XXAArcDoc A 
LEFT JOIN (
SELECT DISTINCT T2.ArcDocINr,
SUBSTRING(
    (
        SELECT ';' + T1.SWort  AS [text()]
        FROM (SELECT D.ArcDocINr, SW.SWort FROM XXAArcDoc D, XXAArcSW SW WHERE D.ArcDocINr = SW.ArcDocINr) T1
        WHERE T1.ArcDocINr = T2.ArcDocINr
        For XML PATH ('')
    ), 2, 255) [SWorte]
FROM (SELECT D.ArcDocINr, SW.SWort FROM XXAArcDoc D, XXAArcSW SW WHERE D.ArcDocINr = SW.ArcDocINr) T2
) B ON A.ArcDocINr = B.ArcDocINr 

我没有足够的知识将其转换为 Oracle。它应该给我与 MSSQL 相同的输出。
有人能帮我吗?

编辑:

以下是一些示例数据:

XXAArcDoc:
ArcDocINr | ...
----------|----------
1         |
2         |
3         |
.         |
.         |
.         |

XXAArcSW:
ArcSWINr | ArcDocINr | SWort
---------|-----------|---------
6        | 1         | Müller
7        | 1         | 100
8        | 2         | 111111
9        | 2         | 13579
10       | 2         | 002
11       | 3         | TM-AH

这是我想要的输出:
ArcDocINr | SWorte
----------|---------
1         | Müller;100
2         | 111111;13579;002
3         | TM-AH

最佳答案

使用 LISTAGG :

SELECT ArcDocINr,
       LISTAGG(
          SWort,
          ';'
       ) WITHIN GROUP ( ORDER BY ArcSWINr ) AS SWorte
FROM   XXAArcSW
GROUP BY ArcDocINr;

更新 :

如果您正在插入 XXAArcDoc使用来自 XXAArcSW 的值的表表然后是这样的:
INSERT INTO XXAArcDoc ( ArcDocINr, SWorte )
SELECT ArcDocINr,
       LISTAGG( SWort, ';' ) WITHIN GROUP ( ORDER BY ArcSWINr )
FROM   XXAArcSW
GROUP BY ArcDocINr

关于sql - 将 MSSQL 'FOR XML PATH' 转换为 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44941304/

相关文章:

c# - 我怎样才能插入到两个sql相关的表中?

sql - STIntersection 结果为 STIntersects = 0

javascript - 如何对 cartodb 数据库中 javascript/jquery 生成的查询转义 SQL 查询的单引号?

sql-server - 按日期从 SQL Server 中删除记录并忽略时间戳

c# - SQL Server 中的日期列到 ASP.NET 模型中的 System.DateTime

database - "Unit"测试数据库

sql - 与聚合交叉应用

c# - BulkCopy WriteToServer() 插入错误列

java - 多线程数据库读取

sql - 如何根据标志或最近的更新时间戳获取不同的记录?