Обновление с использованием Join (s) - Multi DB / Table - PullRequest
0 голосов
/ 07 марта 2011

У меня есть сценарий, в котором я хотел бы обновить несколько полей в нескольких таблицах, используя только один экземпляр. Мне нужен синтаксис для выполнения таких операций в нескольких базах данных (Oracle и MSSQL).

В данный момент я застрял в следующем утверждении из MSSQL:

update table1
set table1.value = 'foo'
from table1 t1 join table2 t2 on t1.id = t2.tab1_id
where t1.id = 1234

Я бы хотел обновить поле в t2, а также в том же выражении.

Далее я хотел бы выполнить те же обновления на Oracle.

РЕДАКТИРОВАТЬ:
Похоже, я не могу обновить несколько таблиц только одним оператором.

Существует ли синтаксис, который работает для Oracle и MSSql при обновлении с помощью объединения?

Привет

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

Похоже, я не могу обновить несколько Таблицы в одном утверждении.

Есть ли синтаксис, который работает для Oracle и MSSql при обновлении с использованием Регистрация

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

Начальный уровень Стандартный код SQL-92 поддерживается обеими платформами, поэтому должен работать следующий код SQL-92 «скалярные подзапросы»:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

Обратите внимание, что при использовании имени корреляции t1 для Ttble1 допустимый синтаксис в соответствии со стандартом SQL-92 это материализует таблицу, а UPDATE будет затем нацелен на материализованную таблицу 't1' и покинет базу Таблица 'table1` незатронута, что я предполагаю, не является желаемым эффектом. Хотя я вполне уверен, что и Oracle, и SQL Server не соответствуют этим требованиям, и что на практике все будет работать, как и ожидалось, нет ничего плохого в том, чтобы быть крайне осторожным и придерживаться синтаксиса SQL-92, полностью квалифицируя целевую таблицу.

Людям не нравится «повторный» код в вышеприведенных подзапросах (хотя оптимизатор должен быть достаточно умен, чтобы оценивать его только один раз).

Более поздние версии Oracle и SQL Server поддерживают оба стандарта SQL: 2003 MERGE Синтаксис, возможно, сможет использовать что-то похожее на это:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

Я только что заметил, что ваш пример еще проще, чем я думал, и просто требует простого подзапроса, который должен работать на большинстве продуктов SQL, например.

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );
0 голосов
/ 07 марта 2011

в Oracle вы можете обновить только одну таблицу, но вы можете подумать об использовании триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...