【问题标题】:Error when rewriting SQL Server query to postgresql and replacing stuff() with string_agg()将 SQL Server 查询重写为 postgresql 并将 stuff() 替换为 string_agg() 时出错
【发布时间】:2020-01-21 19:30:06
【问题描述】:

我正在将应用程序从 SQL Server 迁移到 Postgresql,并且必须重写一些定期运行的查询。特别是我遇到了麻烦,因为我必须用string_agg() 替换stuff()XML Path。通常我可以这样做,但在这种情况下,stuff() 是一个子查询,所以当我运行它时,我收到一个“由用作表达式的子查询返回的多行”错误。我对 SQL 和 Postgresql 的经验还不够丰富,无法解决这个问题。

我遇到困难的 SQL Server 部分:

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 重写返回错误:

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

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(),但它不包括子查询。

【问题讨论】:

    标签: sql-server postgresql


    【解决方案1】:

    尝试替换这个:

    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
    

    关于这个:

    (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
    

    【讨论】:

    • 谢谢@Максим Золотенко 我不再收到错误消息,但选择查询的列都显示为空。我认为问题可能在于我如何进行连接
    • 您可以通过在count(*) 上替换string_agg(COM.cname, '') 来检查您的子查询是否返回任何值。如果所有值都等于 0,则子查询中的问题。
    • HI @@Максим Золотенко 我的问题似乎是我如何更改为查询以解决“错误:关系表名不存在错误。如果我在 SQL 中运行查询 select * from dbo.AO_2C3287_USER_DATA 我得到几百条记录。如果我在 postgres 中运行它,我会收到关系不存在错误。我可以通过使用双引号来解决这个错误,但没有返回数据。所以我相信这就是我得到 null 的原因在我的完整查询中。我现在正在寻找解决此问题的方法,但应该不会太难。
    • 我很笨。当我执行应用程序内导出和导入时,该应用程序没有填充某些表。因此,当我希望它们有数据时,我正在查询的一些表是空的。添加测试数据证实了这一点。问题现已解决。
    猜你喜欢
    • 2023-01-24
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多