Postgresql: обновление с двумя внутренними объединениями [MySQL to PostgreSQL] - PullRequest
0 голосов
/ 27 декабря 2018

В MySQL можно сделать что-то вроде этого:

update 
    table_a A 
inner join 
    table_b B 
on 
    A.field_five = B.field_five
inner join 
    table_c C 
on 
    B.field_one = C.field_one and A.field_two = C.field_two
set A.field_three = C.field_four

Я попытался создать такой же запрос в PostgreSQL, как это:

update table_a A 
    set A.field_three = C.field_four
from table_b B  
    inner join table_c C 
on 
    B.agency_id = C.agency_id and A.field_two = C.field_two
where 
    A.field_five = B.field_five

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

ОШИБКА: недопустимая ссылка на запись предложения FROM для таблицы "a"

Я использую PostgreSQL 11. Как правильно выполнить этот запрос в postgres

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

не указывайте, какую таблицу обновлять в «set», и переместите «A.field_two = C.field_two» в предложение where

update table_a A
    set field_three = C.field_four
from table_b B  
    inner join table_c C 
on 
    B.agency_id = C.agency_id 
where 
    A.field_five = B.field_five
    and A.field_two = C.field_two

https://www.db -fiddle.com /е / mipu88sd4JDar25TtvQCQJ / 1

0 голосов
/ 28 декабря 2018

Вы можете переписать его, используя CTE:

WITH cte AS (
  SELECT c.*, b.field_five
  FROM table_b B  
  JOIN table_c C 
    ON B.agency_id = C.agency_id
)
UPDATE table_a A 
SET field_three = C.field_four
FROM cte c
WHERE A.field_five = c.field_five
  AND A.field_two = c.field_two;

db <> fiddle demo

...