Как насчет разбить его и проверить, получаете ли вы правильные результаты и постепенно их объединяете?
Условие WHERE для начального ОБНОВЛЕНИЯ (отредактировано, чтобы ВНУТРЕННИЕ СОЕДИНЕНИЯ вместо ВЫБРАТЬ IN) и также выбрано oildatasetid not oildatasetstatusid :
SELECT oildatasetid FROM oildatasetstatus
INNER JOIN oildataset
ON oildataset.oildatasetid = oildatasetstatus.oildatasetid
INNER JOIN samplepoint
ON oildatasetstatus.samplepoinid = samplepoint.samplepointid
INNER JOIN customersite
ON samplepoint.customersiteid = customersite.customersiteid
WHERE customerid = 2;
Это должно вернуть тот же список oildatasetid, что и ваш запрос, но работать быстрее.
Теперь оператор UPDATE:
UPDATE oildatasetstatus SET oildatasetstatusid =
CASE
WHEN oildatasetstatusid = 5 THEN 16
WHEN oildatasetstatusid = 6 THEN 17
WHEN oildatasetstatusid = 7 THEN 18
WHEN oildatasetstatusid = 8 THEN 18
WHEN oildatasetstatusid = 9 THEN 18
WHEN oildatasetstatusid = 10 THEN 19
WHEN oildatasetstatusid = 11 THEN 20
END
WHERE oildatasetid IN (
SELECT oildatasetid FROM oildatasetstatus
INNER JOIN oildataset
ON oildataset.oildatasetid = oildatasetstatus.oildatasetid
INNER JOIN samplepoint
ON oildatasetstatus.samplepoinid = samplepoint.samplepointid
INNER JOIN customersite
ON samplepoint.customersiteid = customersite.customersiteid
WHERE customerid = 2
);
Я избегаю МЕЖДУ, за исключением случаев, когда это абсолютно необходимо:
UPDATE oildataset SET oillabid = 9 WHERE oildatasetstatusid >= 16 AND oildatasetstatusid <= 20;