На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> UPDATE SELECT , PostgreSQL 9.4
    ExpandedWrap disabled
      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:
      какая версия PG у вас?? Такой синтаксис только начиная с 9.5
        Цитата grgdvo @

        Я в топе указал, что PostgreSQL 9.4.
        Печально, что вышеприведенная конструкция работает лишь с 9.5.
        Но должна же быть схожая конструкция для младших версий.
        Вариант с where = (SELECT ...) не интересен.
        Нужно обновление таблицы данными и по условию выборки из других таблиц.
          Попробуй такой запрос:
          ExpandedWrap disabled
            update t1
            set t1.f1= t2.f1,
            t1.f2 =  t2.f2
            from t1
            right join t2 on t1.id = t2.f1
            MIF, t1 нельзя указывать и под UPDATE и под FROM.

            HighMan, попробуйте вот так, вроде эквивалентно

            ExpandedWrap disabled
              update t1 set (f1, f2) = (t2.f1, t2.f2)
              from t2 where t1.id = t2.f1;
              ExpandedWrap disabled
                update t1 set (f1, f2) = (t2.f1, t2.f2)
                 
                from t2 where t1.id = t2.f1;

              Такой способ работает, но я не представляю как подобным запросом обрабатывать связи таблиц источников.
                Вы можете делать JOIN практически также как в SELECT. Например

                ExpandedWrap disabled
                  update t1 set (f1, f2) = (t2.f1, t2.f2)
                  from t2, t3 where t1.id = t2.f1 and t2.f2 = t3.id;


                ExpandedWrap disabled
                  update t1 set (f1, f2) = (t2.f1, t2.f2)
                  from t2 left join t3 on t2.f2 = t3.id where t1.id = t2.f1;
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0291 ]   [ 15 queries used ]   [ Generated: 29.03.24, 06:32 GMT ]