我正在将应用程序从SQL Server迁移到Postgresql,并且必须重写一些定期运行的查询。我特别遇到麻烦,因为我必须用stuff()
替换XML Path
和string_agg()
。通常,我可以执行此操作,但是在这种情况下,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()
,但是它不涵盖子查询。
尝试替换为:
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