Ошибка: целевая таблица должна быть частью предиката equijoin - PullRequest
0 голосов
/ 12 июня 2018

В этом запросе:

update public.dctable
set dc = 1 
from (
        select d.*,
         min(time) over (partition by prod, customer, city, num) as mintime,
         row_number() over (partition by prod, customer, city, num order by 
time) as seqnum
  from public.dctable d
  ) dclk
  where dclk.seqnum <> 1

Я получаю сообщение об ошибке:

ОШИБКА: XX000: таблица назначения должна быть частью предиката equijoin

Не вижу, чего мне не хватает.Просто нужно установить dc = 1, где time> mintime и seqnum <> 1.

Есть идеи?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Я предполагаю, что Redshift следует семантике Postgres на update.Если так:

update public.dctable d
    set dc = 1 
    from (select d.*,
                 min(time) over (partition by prod, customer, city, num) as mintime,
                 row_number() over (partition by prod, customer, city, num order by 
    time) as seqnum
          from public.dctable d
          ) d2
    where d2.prod = d.prod and d2.customer = d.customer and d2.city = d.city and
          d2.num = d.num and d2.mintime < d.time;

Я не думаю, что row_number() необходим для того, что вы хотите сделать.

0 голосов
/ 13 июня 2018

Вы получаете эту ошибку, потому что обновляемая основная таблица не присоединяется напрямую к таблицам в части запроса using.предложение where должно иметь обновленную таблицу как часть предиката.Например (ваш запрос работает как есть):

update public.dctable set dc = 1 
  from (
    select by prod, customer, city, num, min(time) as time
    from public.dctable group by 1,2,3,4
  ) dclk
where dclk.prod = dctable.prod
and dclk.customer =dctable.customer
and dclk.city=dctable.city
and dclk.num=dctable.num
and dclk.time=dctable.time
0 голосов
/ 12 июня 2018

вам нужно присоединить исходную таблицу к таблице from следующим образом:

update public.dctable as s
set dc = 1 
from (
        select d.*,
         min(time) over (partition by prod, customer, city, num) as mintime,
         row_number() over (partition by prod, customer, city, num order by 
time) as seqnum
  from public.dctable d
  ) dclk
  where dclk.seqnum <> 1 AND s.id=dclk.id
...