Превратите select в обновление с несколькими соединениями Postgres

#postgresql #join

#postgresql #Присоединиться

Вопрос:

Поэтому я впервые хочу обновить запрос с несколькими соединениями.

База данных = Postgres v. 10

Это то, что я пробовал до сих пор:

 update table1 t1 set t4.datum = t1.datum from table1 t1 inner join table3 t3 on t3.id = t1.id inner join table4 t4 on t4.id = t3.t4_id where t3.id = 550 and t4.scale is not null and t4.datum is null  

Ошибка : Ошибка SQL [42712]: ОШИБКА: имя таблицы «t1» указано более одного раза

Следующая попытка:

 update table1 t1 set t4.datum = t.datum from table1 t inner join table3 t3 on t3.id = t.id inner join table4 t4 on t4.id = t3.t4_id where t3.id = 550 and t4.scale is not null and t4.datum is null  

Ошибка: Ошибка SQL [42703]: ОШИБКА: столбец «t4» отношения «таблица 1» не существует Должность: 28

Последняя попытка:

 update table1 t1 set t4.datum = t.datum from table1 t inner join table3 t3 on t3.id = t.id inner join table4 t4 on t4.id = t3.t4_id where t1.id = t.id and t3.id = 550 and t4.scale is not null and t4.datum is null  

Ошибка: Ошибка SQL [42703]: ОШИБКА: столбец «t4» отношения «таблица 1» не существует Должность: 28

Что я делаю не так?

Ответ №1:

Вы не должны повторять целевую таблицу ОБНОВЛЕНИЯ в предложении FROM. Так что что-то вроде. Задание set t4.datum = t.datum также кажется неправильным. Если вы хотите обновить table1 , вы не можете ссылаться t4 на левую часть задания. Кроме того, целевые столбцы не могут быть «квалифицированы по таблице» внутри части НАБОРА (так как ясно, какой столбец таблицы имеется в виду)

Поэтому я думаю, что вы ищете что-то вроде этого:

 update table1 t1   set datum = t4.datum from table3 t3   inner join table4 t4 on t4.id = t3.t4_id where t1.id = t3.id   and t3.id = 550   and t4.scale is not null   and t4.datum is null  

Ответ №2:

Ссылайтесь на псевдоним таблицы в предложении FROM, а затем используйте его повсюду. Я думаю, что я отредактировал это правильно:

 update t1 set t4.datum = t1.datum from table1 t1 inner join table3 t3 on t3.id = t1.id inner join table4 t4 on t4.id = t3.t4_id where t3.id = 550 and t4.scale is not null and t4.datum is null;  

Комментарии:

1. Не работает 🙁

Ответ №3:

Я думаю, что ваша проблема в том, что вы хотите обновить t4.datum данные из таблицы table1 .

Вам следует изменить столбец set t4.datum = t1.datum на t1.datum = t4.datum , потому что вы хотите обновить table1 (запрос на обновление: update table1 t1 ), а t4.datum не ссылаться на table1

Следует изменить запрос, как показано ниже (если вы хотите обновить table1 ):

 update table1 t1 set t1.datum = t4.datum from table1 t inner join table3 t3 on t3.id = t.id inner join table4 t4 on t4.id = t3.t4_id where t1.id = t.id and t3.id = 550 and t4.scale is not null and t4.datum is null  

Отредактированный

Запрос на обновление table4 :

 update table4 u_t4 set datum = t1.datum from table1 t1 inner join table3 t3 on t3.id = t1.id inner join table4 t4 on t4.id = t3.t4_id where t4.id = u_t4.id and t3.id = 550 and t4.scale is not null and t4.datum is null  

Комментарии:

1. Правда, я ошибся с таблицами. На самом деле я хочу обновить таблицу 4, так как t4.datum находится в этой таблице

2. Я отредактировал сообщение для обновления table4