Sql 选择“将内容重写为红移”
我有一个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
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