Переписать OUTER APPLY в Redshift с помощью подзапроса - PullRequest
0 голосов
/ 29 октября 2018

Я переписываю сценарии сервера SQL для повторного смещения запросов к базе данных

У меня есть конструкция НАРУЖНОГО ПРИМЕНЕНИЯ

OUTER APPLY
   (
   SELECT  q.*
   FROM    (
           SELECT  ROW_NUMBER() OVER(ORDER BY ca.Id DESC) AS rn,
                   ca.StateProvince,
                   ca.ZipPostalCode,
                   ca.ContactId
           FROM    public.contact_addresses ca 
           WHERE   ca.OrganizationId = <Parameters.DemographicsOrgId>
                   AND ca.DeletedDate IS NULL
                   AND ca.TypeId = 7
                   AND ca.ContactId = cc.Id
           ) q
   WHERE   q.rn = 1
   ) ca

Но Redshift не имеет внешнего применения. Как Ican правильно переписать его с помощью LEFT JOIN?

UPDATE

Я думаю о переписать это так

LEFT JOIN
   (
   SELECT  q.*,
           q.rn = 1
   FROM    (
           SELECT  ROW_NUMBER() OVER(ORDER BY ca.Id DESC) AS rn,
                   ca.StateProvince,
                   ca.ZipPostalCode,
                   ca.ContactId
           FROM    public.contact_addresses ca
           WHERE   ca.OrganizationId = <Parameters.DemographicsOrgId>
                   AND ca.DeletedDate IS NULL
                   AND ca.TypeId = 7
                   AND ca.ContactId = cc.Id
           ) q
   GROUP BY q.rn
   ) ca
ON ca.rn = 1

Но правильно ли это?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Нет, это не выглядит правильно. Я бы догадался:

LEFT JOIN
(SELECT ca.OrganizationId,
        ROW_NUMBER() OVER (ORDER BY ca.Id DESC) AS rn,
        ca.StateProvince,
        ca.ZipPostalCode,
        ca.ContactId
 FROM  public.contact_addresses ca 
 WHERE ca.DeletedDate IS NULL AND
       ca.TypeId = 7
 GROUP BY ca.OrganizationId, ca.ContactId
) ca
ON ca.ContactId = cc.ID AND
   ca.OrganizationId = <Parameters.DemographicsOrgId> AND
   ca.rn = 1

По сути, вам нужно агрегировать по условиям корреляции (если они равны), а затем использовать их для внешних ON условий.

0 голосов
/ 29 октября 2018

Оператор OUTER APPLY возвращает все строки из левого табличного выражения независимо от их соответствия правому табличному выражению. Для тех строк, для которых нет соответствующих совпадений в правом табличном выражении, он содержит значения NULL в столбцах правого табличного выражения

так что ваш подход правильный

...