Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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.
Подскажите пожалуйста! :wall:

Автор: 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;

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)