2013-07-17 6 views
0

Я хотел бы иметь возможность объединить эти три оператора обновления, поэтому мне не нужно запускать их по отдельности. Я бы обычно вводил несколько «продуктов» и несколько «корзин».Можно ли комбинировать эти три оператора обновления?

Идея состоит в том, чтобы иметь возможность обновлять два поля на основе «fieldB», равное < «5» или «fieldB» между «5» и «10» или «fieldB»> «10», без запуска трех отдельных запросов.

Любая помощь очень ценится.

UPDATE table 
set fieldA = round(8.7 * fieldA,0), 
    fieldB = round(8.7 * fieldB,0)                    
where product in ('APPLE','BANANA') 
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET') 
and fieldB < '5'; 

UPDATE table 
set fieldA = round(4.3 * fieldA,0), 
    fieldB = round(4.3 * fieldB,0)                    
where product in ('APPLE','BANANA') 
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET') 
and fieldB between '5' and '10'; 

UPDATE table 
set fieldA = round(2.5 * fieldA,0), 
    fieldB = round(2.5 * fieldB,0)                    
where product in ('APPLE','BANANA') 
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET') 
and fieldB > '10'; 
+0

Какие СУБД вы используете? Я бы предложил использовать оператор CASE, но как это сделать будет зависеть от того, что вы используете - Oracle, SQL Server, MySQL, ... – leanne

+0

Какую базу данных и версию вы используете? mySQL, SQL Server, Postgress и т. д. Каждый из них поддерживает разные уровни ANSI SQL и может иметь различный синтаксис конкретного поставщика – kheld

ответ

3

Вы можете использовать CASE заявления, синтаксис может зависеть от РСУБД:

UPDATE table 
SET fieldA = CASE WHEN fieldB < '5' THEN round(8.7 * fieldA,0) 
        WHEN fieldB BETWEEN '5' AND '10' THEN round(4.3 * fieldA,0) 
        WHEN fieldB > '10' THEN round(2.5 * fieldA,0) 
      END 
    ,fieldB = CASE WHEN fieldB < '5' THEN round(8.7 * fieldB,0) 
        WHEN fieldB BETWEEN '5' AND '10' THEN round(4.3 * fieldB,0) 
        WHEN fieldB > '10' THEN round(2.5 * fieldB,0) 
      END                    
where product in ('APPLE','BANANA') 
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET') 
+0

Благодарим вас за такие быстрые ответы. Это заявление обновлено. – user1318132

+0

Если это сработало, вы должны выбрать его как ответ, чтобы другие знали в будущем. – leanne

+0

Спасибо. Я даже не понял, что есть флажок, чтобы выбрать ответ как правильный. Это только мой второй вопрос, который я задал. Не могу поверить, как быстро люди отвечают и могут ответить. – user1318132

2

Я думаю, что намерение, что вы хотите, это:

UPDATE table 
    set fieldA = round((case when fieldB < '5' then 8.7 * fieldA 
          when fieldB between '5' and '10' then 4.3 * FieldA 
          when fieldB > '10' then 2.5 * fieldA 
         end), 0), 
     fieldB = round((case when fieldB < '5' then 8.7 * fieldB 
          when fieldB between '5' and '10' then 4.3 * FieldB 
          when fieldB > '10' then 2.5 * fieldB 
         end), 0)                    
    where product in ('APPLE', 'BANANA') and 
      basket IN ('BROWN BASKET', 'RED BASKET', 'YELLOW BASKET', 'BLUE BASKET'); 

Однако это не именно то, что делают ваши оригинальные обновления. Проблема в том, что вы обновляете значение для fieldB в каждом обновлении. Итак, если FieldB - это изначально, тогда он будет установлен в 8.7 * FieldB = 8.7. Затем это будет уловлено вторым обновлением и так далее.

Если это каскадное намерение, то арифметика будет немного отличаться. Однако идея условных обновлений будет одинаковой.

+0

Благодарим вас за такие быстрые ответы. Работала первая инструкция обновления. Я бы не хотел каскадировать. – user1318132

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