2015-02-28 5 views
-1

Моя таблица tbl1 выглядит следующим образом (SQLFiddle):Как обновить несколько строк (не всегда строк) с одинаковым значением?

id col1 col2 col3 
1 0  1  0 
2 1  0  0 
3 0  0  1 
4 1  1  1 
5 0  0  0 

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

Позвольте мне объяснить, например:
Say пользователь вводит 10 для col1. col1 имеет 3 строки, содержащие ноль, поэтому я буду обновлять их до 1, и, наконец, diff i.e. (10 - 3 = 7), я должен обновить в последней строке.

После обновления я ожидаю таблицы выглядеть следующим образом:

id col1 col2 col3 
1 1  1  0 
2 1  0  0 
3 1  0  1 
4 1  1  1 
5 8  0  0 
update tbl1 set col1=1 where id in (select id from tbl1 where col1=0 limit 10) 

Этот запрос обновляет все 0s 1, но как я могу добавить оставшееся до последней строки?

+0

Почему у вас есть «Sql-Server» в качестве тега, если вы хотите SqlLite? – pmbAustin

+0

Если кто-то помогает с SQLite, это было бы здорово, но я в порядке, если некоторые люди также дают мне запрос SQL Server, я получаю идею с этим, а затем я попытаюсь написать его сам – abdulH

ответ

0

Во-первых, выяснить, сколько строк будет обновляться:

SELECT COUNT(*) 
FROM tbl1 
WHERE id IN (SELECT id 
      FROM tbl1 
      WHERE col1 = 0 
      LIMIT 10) 

Обновление те:

UPDATE tbl1 
SET col1 = 1 
WHERE id IN (SELECT id 
      FROM tbl1 
      WHERE col1 = 0 
      ORDER BY id 
      LIMIT 10) 

(. Без ORDER BY, некоторый случайный набор из десяти строк будет обновляться)

Затем обновите последнюю строку:

UPDATE tbl1 
SET col1 = col1 + (10 - ResultFromAbove) 
WHERE id = (SELECT MAX(id) 
      FROM tbl1) 

Чтобы обеспечить согласованность, сделайте все в одном transaction.

+0

Спасибо за решение, попробуем это и update .. спасибо за указатель на транзакцию – abdulH

1

Для выполнения вашей задачи я бы воспользовался 2-мя обновлениями запросов. Первый из них будет запрос у вас уже есть:

UPDATE tbl1 SET col1=1 WHERE id IN (SELECT id FROM tbl1 WHERE col1=0 LIMIT 10); 

Я хотел бы сохранить результат с первого запроса на обновление в переменной (так как она возвращает количество строк), и использовать этот результат в моем следующем запросе :

UPDATE tbl1 SET col1 = col1+updateResult ORDER BY id DESC LIMIT 1; 

(updateResult является то, что возвращается из первого запроса на обновление).

Надеюсь, это поможет.

+0

Спасибо за решение, попробуем и обновим здесь – abdulH

+0

SELECT MAX (id) FROM TABLE может быть быстрее по сравнению с ORDER BY id – cegprakash

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