Sql 选择“将内容重写为红移”

Sql 选择“将内容重写为红移”,sql,sql-server,amazon-redshift,Sql,Sql Server,Amazon Redshift,我有一个SQL脚本,需要转换为红移 以下是我遇到问题的部分: LEFT JOIN ( SELECT STUFF(( SELECT ','+ clo.name FROM public.label_entities cl JOIN public.label_history clo ON clo.id = cl.label

我有一个SQL脚本,需要转换为红移

以下是我遇到问题的部分:

LEFT JOIN
        (
        SELECT STUFF((
                SELECT ','+ clo.name
                FROM    public.label_entities cl
                JOIN    public.label_history clo
                ON      clo.id = cl.labelid
                WHERE   clo.parentid = 993
                        AND cl.entityid = clv.contactid
                FOR XML PATH('')
                ) ,1,1,'') AS Services
        ) AS labelServices
我已经读到我可以使用
选择listag
并尝试这样使用它:

LEFT JOIN
    (
    SELECT LISTAGG((
            SELECT ','+ clo.name
            FROM    public.label_entities cl
            JOIN    public.label_history clo
            ON      clo.id = cl.labelid
            WHERE   clo.parentid = 993
                    AND cl.entityid = clv.contactid
            FOR XML PATH('')
            ) ,1,1,'') AS Services
    ) AS labelServices
LEFT JOIN
(SELECT cl.entityid, LISTAGG(clo.name, ', ') WITHIN GROUP (ORDER BY clo.name) as names
 FROM public.label_entities cl JOIN
      public.label_history clo
      ON clo.id = cl.labelid
 WHERE clo.parentid = 993
 GROUP BY cl.entityid
) AS labelServices
ON labelServices.entityid = clv.contactid
但它不起作用


那么我如何才能将其重写为正确的呢?

您不需要所有的XML内容。事实上,在SQL Server中进行聚合的是XML,而不是
STUFF()
STUFF()
仅用于在创建字符串后美化字符串

比如说:

LEFT JOIN
    (
    SELECT LISTAGG((
            SELECT ','+ clo.name
            FROM    public.label_entities cl
            JOIN    public.label_history clo
            ON      clo.id = cl.labelid
            WHERE   clo.parentid = 993
                    AND cl.entityid = clv.contactid
            FOR XML PATH('')
            ) ,1,1,'') AS Services
    ) AS labelServices
LEFT JOIN
(SELECT cl.entityid, LISTAGG(clo.name, ', ') WITHIN GROUP (ORDER BY clo.name) as names
 FROM public.label_entities cl JOIN
      public.label_history clo
      ON clo.id = cl.labelid
 WHERE clo.parentid = 993
 GROUP BY cl.entityid
) AS labelServices
ON labelServices.entityid = clv.contactid
使用
replace()
代替
stuff()

编辑1

select REPLACE(','+ 
 (
  SELECT ','+ clo.name
  FROM    public.label_entities cl
  JOIN    public.label_history clo
  ON      clo.id = cl.labelid
  WHERE   clo.parentid = 993
  AND cl.entityid = clv.contactid
  FOR XML PATH('')
 )
 ,',,'
 ,''
)

无效操作:列“cl.entityid”必须出现在GROUP BY子句中或在聚合函数中使用得到他的error@EugeneSukh按entityid添加
分组
,如错误所示。不过要小心。Redshift是一个columnstore数据库,这意味着每列聚合、分组速度非常快,但每行访问速度可能很慢STRING_AGG
和红移中的
listag
确实需要找到单独的行并提取值。设计良好的星型模式可能比需要多个连接、字符串聚合等的模式快几个数量级much@PanagiotisKanavos