2016-10-03 7 views
0

Вопрос:Advanece SQL Update запрос

Хотите обновить Приток, проверяя условие, что значение, которое мы имеем в колонке притока в таблице отчетности например, если мы имеем случай, когда FLAG = «1» THEN «AS» ELSE 'LI' он должен проверить значение для столбца флага, если он равен 1, тогда значение должно быть «AS» else «L1» Примечание. В столбце «Отчеты INFLOW» при разных значениях.

Структура таблицы:

create table dummy (ID VARCHAR(10), PRODUCT VARCHAR(10), INFLOW VARCHAR(10)); 
INSERT INTO dummy(ID,PRODUCT) VALUES('10','999') 
INSERT INTO dummy(ID,PRODUCT) VALUES('11','888') 
INSERT INTO dummy(ID,PRODUCT) VALUES('12','111') 
INSERT INTO dummy(ID,PRODUCT) VALUES('13','222') 

create table REPORTING_FLAG 
(
ID VARCHAR(10), 
PRODUCT VARCHAR(10), 
INFLOW VARCHAR(2000), 
FLAG VARCHAR(10), 
L3 VARCHAR(10) 
); 

INSERT INTO REPORTING VALUES('10','999','CASE WHEN FLAG = ''1'' THEN ''AS'' ELSE ''LI''','1','SALR') 
INSERT INTO REPORTING VALUES('11','888','CASE WHEN L3 = ''SALR'' THEN ''SALR'' ELSE ''OTHR''','1','XYZ') 
INSERT INTO REPORTING VALUES('12','111','ABC','2','PQR') 
INSERT INTO REPORTING VALUES('13','222','SAP','3','QWE') 
+0

, который колонок флага? – ash

+0

Ваш стол не отражает ваш вопрос ... Просьба представить более подробную информацию – Shnugo

+0

Thx для редактирования, но до сих пор неясно ... Какие данные находятся в 'REPORTING_FLAG'? Есть ли только одна строка? является ли столбец «ID» ключевым столбцом? Пожалуйста, [попробуйте следовать этому совету: MCVE] (http://stackoverflow.com/help/mcve) – Shnugo

ответ

0

При выполнении больших вставок, разумно и правильно-прикладной логики для выполнения преобразования на наборах данных, а не каждой отдельной строки.

Даже если это неизбежно, не делайте ошибки, чтобы быть комфортно с мириадами утверждений update/insert, которые не только обходятся ресурсами, но и делят статистику, фрагментируют ваши индексы и диски.

Запустите инструкцию SELECT, которая использует логику CASE и проверит результаты. После того, как вы можете безопасно выполнить это на операторе выбора, преобразовать его в оператор Update (заметьте ваше обновление можно использовать соединение)

0

Это должно работать

declare dummyproducts cursor for select ID, Product, Inflow from reporting 
declare @ID VARCHAR(10), @PRODUCT VARCHAR(10), @INFLOW VARCHAR(2000) 
OPEN dummyproducts 
Fetch next from dummyProducts into @ID, @PRODUCT, @INFLOW 
while @@fetch_Status = 0 
BEGIN 
    declare @sql nvarchar(max) 
    if CHARINDEX('CASE', @INFLOW) > 0 
     set @Inflow = @inflow + ' end' 
    else 
     set @inflow = 'r.inflow' 
    set @sql = 'Update dummy set INFLOW = ' + 
        @INFLOW 
       + ' from 
       reporting r inner join dummy d on r.Product = d.Product and r.ID = d.ID where d.ID = ' + @ID + ' and d.Product = ' + @Product 
    print @sql 
    exec (@sql) 
    Fetch next from dummyProducts into @ID, @PRODUCT, @INFLOW 
END 
close dummyProducts 
deallocate dummyProducts 
GO 
+0

Спасибо, пепел, получил результат, который я искал для. – user3854793

+0

Полезно знать, но не забудьте обновить, если это решит вашу проблему. – ash

+0

Здравствуйте, Эш, не могли бы вы рассказать мне, что вы имеете в виду, не забудьте обновить, если это решит вашу проблему. Поскольку выполнение курсора получило оценщик в фиктивной таблице для столбца притока. – user3854793

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