2013-03-08 6 views
2

Есть ли способ обновить таблицу на основе предложения multiple where. В одном заявлении?Обновление tsql multipe на одной таблице

update A 
set Final = '21' 
from StudentTable A 
where Student_ID= 4 and bitcm= 0 and receipt= 17 



update B 
set Final = '22' 
from StudentTable B 
where Student_ID=4 and bitcm= 0 and receipt =12 


update C 
set Final ='11' 
from StudentTable C 
where Student_ID=4 and bitcmp=1 and receipt=17 


update D 
set Final ='12' 
from StudentTable D 
where Student_ID=4 and bitcmp=1 and receipt=12 

Есть ли способ объединить все это утверждение в одно утверждение?

+0

Да. Наилучший подход зависит - есть ли другие строки для «Student_ID» 4, кроме 4, которые вы показали? –

ответ

4

Да, есть:

UPDATE A 
SET  Final = CASE WHEN bitchcm = 0 AND receipt = 17 THEN '21' 
        WHEN bitchcm = 0 AND receipt = 12 THEN '22' 
        WHEN bitchcm = 1 AND receipt = 17 THEN '11' 
        WHEN bitchcm = 1 AND receipt = 12 THEN '12' 
       END 
FROM StudentTable A 
WHERE Student_ID = 4 AND -- the purpose of the three conditions 
     bitcm IN (0,1) AND -- is to speed up the query. It will not 
     receipt IN (12,17) -- scan the whole records on the table 

Если столбец FINAL является INT, то вам не нужно обернуть значения в одинарные кавычки.

+0

@ypercube - это тот, который я бы попросил для примера? спасибо ': D' –

+0

Хотя ваше предложение верно для этого конкретного случая, весь подход ошибочен. Если вы решите удалить последнее обновление, он также удалит последнюю инструкцию WHEN. Но предложение WHERE остается неизменным и по-прежнему соответствует тем документам, которые мы решили не обновлять. И результат CASE для них будет ... NULL –

+2

@frikozoid, если он решает удалить одно из обновлений, он должен обновить свой запрос. Этот подход на 100% правильный. Это не задача JW планировать будущие изменения в запросе, о котором даже не упоминалось. –

3

Если только эти четыре строки для Student_ID 4, то следующие работы:

update A 
set Final = CASE 
    WHEN bitcm=0 and receipt=17 THEN '21' 
    WHEN bitcm= 0 and receipt =12 THEN '22' 
    WHEN bitcmp=1 and receipt=17 THEN '11' 
    WHEN bitcmp=1 and receipt=12 THEN '12' 
    END 
from StudentTable A 
where Student_ID= 4 

(я предполагаю, что bitcm и bitcmp предназначены для той же колонке, но я не уверен, правописание в использование)

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

UPDATE A 
SET Final = B.Final 
FROM StudentTable A 
INNER JOIN @AboveMentionedTableVariableOrParameter B 
ON 
    A.Student_ID = B.Student_ID and 
    A.bitcm = b.bitcm and 
    A.receipt = b.receipt --And add any other necessary conditions here. 
1

Вы можете использовать сазе

UPDATE StudentTable 
SET Final = 
CASE WHEN Student_ID= 4 and bitcm= 0 and receipt= 17 THEN 21 
    WHEN Student_ID=4 and bitcm= 0 and receipt =12 THEN 22 
    WHEN Student_ID=4 and bitcmp=1 and receipt=17 THEN 11 
    WHEN Student_ID=4 and bitcmp=1 and receipt=12 THEN 12 
END 
WHERE Student_ID = 4 
AND bitcm IN (0,1) 
AND receipt IN (12,17)