Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Базы данных: SQL > UPDATE SELECT |
Автор: HighMan 22.03.16, 12:19 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> create table t1 (id integer, f1 integer, f2 integer); create table t2 (f1 integer, f2 integer); update t1 set (f1, f2) = (select t2.f1, t2.f2 from t1 right join t2 on t1.id = t2.f1); [Err] ОШИБКА: ошибка синтаксиса (примерное положение: "SELECT") LINE 2: (SELECT ^ Я никак не могу сообразить, как правильно обновлять значения в таблице на основании результатов SELECT .. FROM .. JOIN. Подскажите пожалуйста! |
Автор: grgdvo 22.03.16, 20:20 |
какая версия PG у вас?? Такой синтаксис только начиная с 9.5 |
Автор: HighMan 23.03.16, 07:09 |
Цитата grgdvo @ Я в топе указал, что PostgreSQL 9.4. Печально, что вышеприведенная конструкция работает лишь с 9.5. Но должна же быть схожая конструкция для младших версий. Вариант с where = (SELECT ...) не интересен. Нужно обновление таблицы данными и по условию выборки из других таблиц. |
Автор: MIF 23.03.16, 08:31 |
Попробуй такой запрос: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> update t1 set t1.f1= t2.f1, t1.f2 = t2.f2 from t1 right join t2 on t1.id = t2.f1 |
Автор: grgdvo 23.03.16, 12:10 |
MIF, t1 нельзя указывать и под UPDATE и под FROM. HighMan, попробуйте вот так, вроде эквивалентно <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> update t1 set (f1, f2) = (t2.f1, t2.f2) from t2 where t1.id = t2.f1; |
Автор: HighMan 23.03.16, 18:21 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> update t1 set (f1, f2) = (t2.f1, t2.f2) from t2 where t1.id = t2.f1; Такой способ работает, но я не представляю как подобным запросом обрабатывать связи таблиц источников. |
Автор: grgdvo 23.03.16, 20:16 |
Вы можете делать JOIN практически также как в SELECT. Например <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> update t1 set (f1, f2) = (t2.f1, t2.f2) from t2, t3 where t1.id = t2.f1 and t2.f2 = t3.id; <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> update t1 set (f1, f2) = (t2.f1, t2.f2) from t2 left join t3 on t2.f2 = t3.id where t1.id = t2.f1; |