首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Server查询重写为postgresql并用string_agg()替换with ()时出错

将Server查询重写为postgresql并用string_agg()替换with ()时出错
EN

Stack Overflow用户
提问于 2020-01-21 19:30:06
回答 1查看 325关注 0票数 0

我正在将一个应用程序从Server迁移到Postgresql,并且必须重写一些定期运行的查询。我在其中一个方面遇到了困难,因为我必须用stuff()XML Path替换string_agg()。通常我可以这样做,但是在本例中,stuff()是一个子查询,所以在运行这个查询时,我会收到一个“由子查询作为表达式返回的多行”错误。我在SQL和Postgresqlto方面没有足够的经验来解决这个问题。

我陷入困境的SQL Server部分:

代码语言:javascript
复制
SELECT P.pkey + '-' + CAST(JI.issuenum AS VARCHAR(18)) [CASE NUMBER]
, IT.pname [ISSUE TYPE (PREVIOUSLY CASE REASON)]
, JI.CREATED [OPENED DATE]
, CRE.display_name [CREATOR]
, DEP.BIG_DATA [DEPARTMENT]
, REG.BIG_DATA [OFFICE]
, JI.RESOLUTIONDATE [CLOSED DATE]
, STUFF((     SELECT CAST(', ' + COM.cname AS VARCHAR(MAX))
                     FROM nodeassociation NAC
                     INNER JOIN component COM ON NAC.SINK_NODE_ID = COM.ID
                     WHERE NAC.SOURCE_NODE_ID = JI.ID
                     ORDER BY COM.cname
                     FOR XML PATH('')), 1, 2, '') [COMPONENT(S)]
, RCS.customvalue [RESOLUTION CODE (SERVICE)]
, ISNULL(RCI1.customvalue + ' - ', '') + RCI2.customvalue [RESOLTUION CODE (INCIDENT)]
, ISNULL(RCMT1.customvalue + ' - ', '') + ISNULL(RCMT2.customvalue + ' - ','') + ISNULL(RCMT3.customvalue,'') [RESOLTUION CODE (3-tier)]

我失败的postgres重写,返回错误:

由用作表达式的子查询返回的多行

代码语言:javascript
复制
SELECT P.pkey || '-' || CAST(JI.issuenum AS VARCHAR(18)) AS "CASE NUMBER"
, IT.pname "ISSUE TYPE (PREVIOUSLY CASE REASON)"
, JI.CREATED "OPENED DATE"
, CRE.display_name "CREATOR"
, JI.RESOLUTIONDATE "CLOSED DATE"
, string_agg((SELECT COM.cname 
                     FROM nodeassociation NAC
                     INNER JOIN component COM ON NAC.SINK_NODE_ID = COM.ID
                     WHERE NAC.SOURCE_NODE_ID = JI.ID
                     ORDER BY COM.cname, p.pkey, JI.issuenum, IT.pname, JI.CREATED, CRE.display_name, JI.RESOLUTIONDATE, RCS.customvalue, RCI1.customvalue, RCI2.customvalue, RCMT1.customvalue, RCMT2.customvalue, RCMT3.customvalue, DEP."BIG_DATA", REG."BIG_DATA" 
                     ), '') AS COMPONENTS
, RCS.customvalue RESOLUTION_CODE_SERVICE
, coalesce(RCI1.customvalue || ' - ', '') || RCI2.customvalue "RESOLTUION-CODE-INCIDENT"
, coalesce(RCMT1.customvalue || ' - ', '') || coalesce(RCMT2.customvalue || ' - ','') || coalesce(RCMT3.customvalue,'') "RESOLTUION-CODE 3-tier"
, DEP."BIG_DATA" "DEPARTMENT"
, REG."BIG_DATA" "OFFICE"

我使用了这个关于用old post替换stuff()string_agg(),但是它没有包含子查询。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-21 19:45:02

试着替换这个:

代码语言:javascript
复制
string_agg((SELECT COM.cname 
                     FROM nodeassociation NAC
                     INNER JOIN component COM ON NAC.SINK_NODE_ID = COM.ID
                     WHERE NAC.SOURCE_NODE_ID = JI.ID
                     ORDER BY COM.cname, p.pkey, JI.issuenum, IT.pname, JI.CREATED, CRE.display_name, JI.RESOLUTIONDATE, RCS.customvalue, RCI1.customvalue, RCI2.customvalue, RCMT1.customvalue, RCMT2.customvalue, RCMT3.customvalue, DEP."BIG_DATA", REG."BIG_DATA" 
                     ), '') AS COMPONENTS

在这方面:

代码语言:javascript
复制
(SELECT string_agg(COM.cname,'')
                     FROM nodeassociation NAC
                     INNER JOIN component COM ON NAC.SINK_NODE_ID = COM.ID
                     WHERE NAC.SOURCE_NODE_ID = JI.ID
                     ORDER BY COM.cname, p.pkey, JI.issuenum, IT.pname, JI.CREATED, CRE.display_name, JI.RESOLUTIONDATE, RCS.customvalue, RCI1.customvalue, RCI2.customvalue, RCMT1.customvalue, RCMT2.customvalue, RCMT3.customvalue, DEP."BIG_DATA", REG."BIG_DATA" 
                     ) AS COMPONENTS
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59847998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档