2014-01-08 7 views
-2

Предположим, у меня есть таблица, как этотзначения Обновление с условиями

END 

id  rank degree 
1  4  3 
2  3  3 


**rank 4 has 4 degrees. 
**rank 3 has 4 degrees. 

И мы будем считать, что каждый ранг имеет некоторое количество градусов. Я предполагаю, что ранг 3 имеет 4 градуса.

И я хочу, чтобы при увеличении степени, которая является максимальным для текущего ранга, ранг увеличивается на 1, а степень сбрасывается обратно до 1. Например, я хочу увеличить степень id 2 в приведенную выше таблицу 1. В результате ранг должен быть 4, а степень должна быть равна 1.

Как эффективно сделать это обновление в SQL Server 2008?

+1

Что вы сделали до сих пор? – Falaque

+4

Я читал ваш вопрос 4 раза, и я до сих пор этого не понимаю! как рассчитывается ранг? – bhs

+1

Ват - ваше требование.? – Kishore

ответ

1

Если есть справочная таблица, содержащая информацию о максимальной степени для каждого поддерживаемого ранга (назовем его dbo.ranks), что-то вроде этого:

rank maxdegree 
---- --------- 
1  3 
2  4 
3  5 
4  4 
... ... 

где maxdegree предполагается целое число чем 0, то здесь, как вы могли бы использовать:

UPDATE t 
SET 
    t.rank += t.degree/r.maxdegree, 
    t.degree += t.degree % r.maxdegree + 1 
FROM dbo.atable AS t 
INNER JOIN dbo.ranks AS r 
ON t.rank = r.rank 
; 

где dbo.atable предполагается имя таблицы обновить.

Обратите внимание, что этот запрос предназначен только для увеличения на 1. Если вы хотите, чтобы иметь возможность увеличить degree произвольное число, вам нужно будет сделать более существенные изменения, чем просто замена 1 в + 1 бите.

Кроме того, этот запрос не будет работать корректно с некоторыми случаями недействительных данных в вашей таблице (например, градусов больше соответствующих максимальных значений), поэтому перед тем, как попытаться использовать это, убедитесь, что вы удалили какие-либо аномалии.

+0

Спасибо большое, вот что я искал. слава Богу, кто-то меня достал :) .. – Adly

3

Я предполагаю, что вы хотите обновить все строки того же ранга, что и id=3.

UPDATE t SET t.rank = t.rank + 1, t.degree = 1 
FROM tableName t 
WHERE rank = (SELECT rank FROM tableName t2 WHERE [email protected]) 
+0

отлично, спасибо. является perforamnce сделать предложение выбора в методе обновления является хорошим? или что? – Adly

+0

@SELECT_UPDATE: производительность зависит от многих вещей, таких как ваши индексы. Посмотрите: https://www.simple-talk.com/sql/performance/the-seven-sins-against-tsql-performance/ В целом, [sargable] (http://en.wikipedia.org/ wiki/Sargable) (оптимизируемый), следовательно, эффективный. –

+0

Большое спасибо за ваш ответ, это было действительно полезно. – Adly

2

Это то, что вы хотите?

update t 
    set degree = (case when degree = 5 then 1 else degree + 1 end), 
     rank = (case when degree = 5 then rank + 1 else rank end) 
    where id = 3; 
+0

Я сделал то же самое, и он работал раньше. мой вопрос в том, является ли идентификатор неизвестным, и я хочу внести эти изменения во всю таблицу? – Adly

+0

@SELECT_UPDATE. , , Затем удалите условие 'where'. –

+0

ОК спасибо, я попробую еще раз. – Adly

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