ОБНОВЛЕНИЕ Postgres с помощью SELECT с ВНУТРЕННИМ СОЕДИНЕНИЕМ нескольких таблиц - PullRequest
0 голосов
/ 26 октября 2018

Я только начинаю с Postgres, и я обнаруживаю следующее Query, сделанное в Postgres, которое стремится принести мне данные из 4 различных tables.

SELECT
    table1.id,
    table2.icon,
    table3.title,
    table4.description
FROM
    table1
    JOIN table5 ON id_t5 = id_t3
    JOIN table3 ON id_t1 = id_t3
    AND id_t3 = 816
LEFT JOIN table2 ON table5.id_t2_fk = table2.id_t2 
LEFT JOIN table4 ON table4.id_t3_fk = table1.id_t1;

Моя проблема в том, что я должен сделать UPDATE из этих 4 таблиц после генерации Query.

Я не могу придумать, как решить проблему, поскольку синтаксис UPDATE для Postgres отличается от синтаксиса MySQL или SQLserver.

Я пытался сделать это:

UPDATE 
    table1
    INNER JOIN table5 ON id_t5 = id_t3
    INNER JOIN table3 ON id_t1 = id_t3
    LEFT JOIN table2 ON table5.id_t2_fk = table2.id_t2 
    LEFT JOIN table4 ON table4.id_t3_fk = table1.id_t1
SET
    table2.icon        = "new icon",
    table3.title       = "new title",
    table4.description = "new description"
WHERE
    table1.id_t1= 816;

1 Ответ

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

Postgres позволяет вам делать обновления в CTE.Возможно, это то, что вы хотите:

with data as (
      select t1.id, t2.id_t2, t2.icon, t3.id_t3, t3.title,
             t4.id_t4, t4.description
      from table1 t1 join
           table5 t5 
           on id_t5 = id_t3 join
           table3 
           on id_t1 = id_t3 and id_t3 = 816 left join
           table2 t2
           on t5.id_t2_fk = t2.id_t2 left join
           table4 t4
           on t4.id_t3_fk = t1.id_t1
       where t1.id_t1= 816
      ),
      u2 as (
       update table2
           set icon = 'new icon'
           where t2.id_t3 in (select data.id_t2 from data)
       returning *
      ),
      u3 as (
       update table3
           set title = 'new title'
           where id_t3 in (select data.id_t3 from data)
       returning *
      )
update table4
   set description = 'new description'
   where id_t4 in (select data.id_t4 from data);

Если нет, то что-то похожее будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...