Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 LEFT JOIN в UPDATE в блоке FROM  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
Всем привет.
В процессе переноса кода с MS SQL на Postgresql возникли небольшие трудности...
Код MS SQL
UPDATE T
SET T.field_1 = CASE WHEN .. THEN t2.field_1 ELSE t3.field_1 END 
FROM table_1 AS T
  INNER JOIN table_2 AS t2
	 ON t.F_t2_id  = t2.id
  INNER JOIN table_3 AS t3
     ON t.F_t3_id  = t3.id


успешно перевел на
 UPDATE table_1 AS T
SET T.field_1 = CASE WHEN .. THEN t2.field_1 ELSE t3.field_1 END 
FROM table_2 AS t2
	 table_3 AS t3, 
 WHERE t.F_t2_id  = t2.id
  AND t.F_t3_id  = t3.id   

Но как быть,если в блоке from есть left join и значения от него обрабатываются в блоке SET ?
Код MS SQL :
UPDATE T
SET T.field_1 = CASE WHEN .. THEN t2.field_1 WHERE .. THEN ISNULL(t4.field_1,0) ELSE t3.field_1 END 
FROM table_1 AS T
  INNER JOIN table_2 AS t2
	 ON t.F_t2_id  = t2.id
  INNER JOIN table_3 AS t3
     ON t.F_t3_id  = t3.id	 
   LEFT JOIN table_4 AS t4
     ON  t.F_t4_id  = t4.id
31 июл 20, 16:31    [22176311]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN в UPDATE в блоке FROM  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
self join с table_1 - только такой вариант остался ? Есть таблицы без ключа уникальности(ни PK ни UK). Т.е. по некоторым таблицам self join проблематично сделать...
31 июл 20, 16:51    [22176322]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN в UPDATE в блоке FROM  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4230
Cristiano_Rivaldo,

ну например подзапросом

UPDATE T
SET T.field_1 = CASE WHEN .. THEN t2.field_1 WHERE .. THEN coalesce((select t4.field_1 from table_4 AS t4 where  t.F_t4_id  = t4.id), 0) ELSE t3.field_1 END 
FROM table_1 AS T
  INNER JOIN table_2 AS t2
	 ON t.F_t2_id  = t2.id
  INNER JOIN table_3 AS t3
     ON t.F_t3_id  = t3.id	 
31 июл 20, 20:15    [22176410]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN в UPDATE в блоке FROM  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
Maxim Boguk,

)))) В реальных примерах там много полей в блоке SET. Писать для каждого поля отдельный подзапрос - накладно. Видимо self join единственный адекватный вариант пока...
1 авг 20, 08:22    [22176475]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN в UPDATE в блоке FROM  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50816
MERGE использовать что-то мешает?..
1 авг 20, 14:01    [22176528]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN в UPDATE в блоке FROM  [new]
vyegorov
Member

Откуда: Рига
Сообщений: 1196
Dimitry Sibiryakov,

Отсутствие в Postgres-е оного ¯\_(ツ)_/¯
1 авг 20, 17:36    [22176555]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN в UPDATE в блоке FROM  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50816
Так и не осилили, хотя https://www.postgresql.org/message-id/attachment/23520/sql-merge.html намекает на его появление ещё в восьмой версии?..

Сообщение было отредактировано: 2 авг 20, 13:52
2 авг 20, 13:50    [22176680]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить