2016-06-20 5 views
0

Мне интересно, возможно ли совместить следующие два запроса или более? Текущее поведение будет делать два раза сканирования таблицы в таблице Б, я хочу, чтобы после комбинации было однократное сканирование в таблицу Б. Спасибо.Объединить несколько операторов обновления

update tableA A 
set A.column2=B.column3 
     from tableB B 
     where A.column1 = B.column1 
     B.column2=1111 
     and B.column3 is not null; 


update tableA A 
set A.column2=B.column4 
     from tableB B 
     where A.column1 = B.column1 
     and B.column2=2222 
     and B.column4 is not null; 
+0

Вы должны использовать операторы case, чтобы разрешить запрос устанавливать значения на разных условиях, подобных вам. Это похоже на вашу проблему: http://stackoverflow.com/questions/35533828/how-to-combine-two-update-queries-having-different-where-condition. – Dresden

+0

Поскольку ваши запросы теперь читаются, между таблицей А и таблицей Б нет связи. Это верно? – nscheaffer

+0

@ Дрезден, дело в том, что утверждения case не позволяют мне «выбирать из того, где» –

ответ

0

Это будет синтаксис SQL-сервер будет, и я уверен, что это пересекает, но я видел несколько статей, которые предлагают другой синтаксис для MySQL. Но в основном используйте предложение join или where, которое будет relate таблиц, а затем используйте оператор case, чтобы выбрать ваше значение. В приведенном ниже решении вы никогда не будете использовать ELSE оператора case, но для хорошей ссылки на меру укажите текущее значение столбца для всего, что соответствовало бы вашему join, но не условиям вашего заявления case.

Использование РЕГИСТРИРУЙТЕСЬ

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN b.Column2 
     WHEN b.Column1 = 2222 THEN b.Column3 
     ELSE a.Column1 
    END 
FROM 
    [DatabaseA].TableA a 
    INNER JOIN [DatabaseB].TableB b 
    ON a.Column4 = b.Column4 
    AND (
      (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
      OR 
      (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
     ) 

За ваш комментарий не использования объединения.

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN (SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4) 
     WHEN b.Column1 = 2222 THEN (SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4) 
     ELSE a.Column1 
    END 
FROM 
    TableA 
WHERE 
    EXISTS (
     SELECT * 
     FROM 
      TableB 
     WHERE 
      b.Colmn4 = a.Column4 
      AND (
       (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
       OR 
       (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
      ) 

Это выглядит сумасшедшим, но оно только обновит строки, которые вы намереваетесь. В противном случае, если вам все равно, обновите ли вы весь столбец, вы можете сделать что-то подобное.

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN ISNULL((SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 1111),a.Column1) 
     WHEN b.Column1 = 2222 THEN ISNULL((SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 2222),a.Column1) 
     ELSE a.Column1 
    END 
FROM 
    TableA 

Вы также можете сделать это с помощью одного подзаголовка, если вы готовы обновить всю таблицу.

UPDATE a 
    SET Column1 = ISNULL(

     (  SELECT (CASE WHEN b.Column1 = 1111 THEN b.Column2 ELSE b.Column3 END) 
     FROM 
      TableB 
     WHERE 
      b.Colmn4 = a.Column4 
      AND (
       (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
       OR 
       (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
      ) 
     ),a.Column1)  
FROM 
    TableA 

Хитрость во всех этих ответов, вы должны быть в состоянии связать ВЫБЕРИТЕ заявление TableB с TableA иначе вы не получите ваш предполагаемый результат.

+0

В MySQL вы удаляете 'FROM' и переводите оператор объединения в первую строку как:' UPDATE [TableA] INNER JOIN ... '. – Parfait

+0

Привет, Matt и Parfait, спасибо за вашу помощь! Этот подход будет работать в mysql/sql. –

+0

избавиться от присоединиться заявление так, что другой подход подобен следующему: Обновление SET Column1 = СЛУЧАЙ ПРИ b.Column1 = 1111 ТОГДА b.Column2 КОГДА b.Column1 = 2222 ТОГДА b.Column3 ELSE a.Column1 END ОТ [DatabaseB].TableB б ГДЕ a.Column4 = b.Column4 И ( (b.Column1 = 1111 И b.Column2 IS NOT NULL) ИЛИ (b.Column1 = 2222 И b.Column3 IS NOT NULL) ) –

Смежные вопросы