Способ работы вашего оператора теперь будет работать (однако, как только вы добавите ссылку на столбец в оператор case, как было упомянуто в других публикациях), если позволить остальному синтаксису остаться без комментариев, это будет плохой услугой для других. в вашей ситуации.
Хотя вам может потребоваться выполнить этот запрос только один раз, я и другие сталкивались с подобными ситуациями, когда Update
для нескольких строк также полагается на таблицы данных 3 или 4 вне нашего источника и должно выполняться много раз ( как в отчете).
Свернув ваши подвыборки в один оператор select
и сохранив результаты этого в таблицу #Temp
или переменную @Table
, вам нужно выполнить этот поиск только один раз, а затем выбрать из набора результатов для ваше обновление.
Вот пример использования переменной @table:
declare @OilStatus table (oilDatasetStatusID int)
insert into @OilStatus
select odss.oildatasetstatusid
from OildataSetStatus odss
join oilDataSet ods on ods.OilDataSetID = odss.OilDataSetID
join SamplePoint sp on sp.SamplePointID = odss.SamplePointID
join CustomerSite cs on cs.CustomerSiteID = sp.CustomerSiteID
where cs.CustomerID = 2
update oildatasetstatus
set oildatasetstatusid =
case oildatasetstatusid
WHEN 5 THEN 16
WHEN 6 THEN 17
WHEN 7 THEN 18
WHEN 8 THEN 18
WHEN 9 THEN 18
WHEN 10 THEN 19
WHEN 11 THEN 20
end
where oildatasetlabstatusid in ( select oilDatasetStatusID from @OilStatus )
Поскольку у меня нет вашей точной схемы, могут быть ошибки при попытке реализовать приведенный выше пример, но я думаю, вы поймете эту идею.
Кроме того, всякий раз, когда несколько таблиц используются в одном операторе, старайтесь предварять каждое имя столбца псевдонимом или полным именем таблицы. Это помогает предотвратить потерю движка sql и людей, читающих ваш код.