SELECT STUFF переписать в Redshift - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть сценарий 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

Я прочитал, что могу использовать SELECT LISTAGG и попробовать использовать его так:

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

Но это не работает.

Так, как я могу переписать это, чтобы быть правильным?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

используйте replace() вместо stuff()

select STUFF(', hai, hello, fine', 1, 1, '')
select replace(','+', hai, hello, fine', ',,', '')  --- ', hai, hello, fine' would be
                                                    --- returned by inner select

РЕДАКТИРОВАТЬ 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('')
 )
 ,',,'
 ,''
)
0 голосов
/ 13 сентября 2018

Вам не нужны все вещи XML. Фактически, агрегация в SQL Server выполняется XML, а не STUFF(). STUFF() просто используется для украшения строки после ее создания.

Итак, как-то так:

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
...