Проблема с пустыми значениями и оператором UPDATE - PullRequest
1 голос
/ 28 мая 2010
UPDATE TableA
SET Value = a.Value * b.AnotherValue
FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true);

Вот проблема. Поле Значение для TableA не допускает нулевые значения. Если вычисление a.Value * b.AnotherValue дает ноль, выдается ошибка. Теперь вопрос. Есть ли способ сказать ОБНОВЛЕНИЮ игнорировать фазу SET, когда результат вычисления является нулевым, и удалить запись, а не обновлять ее. Это ОБНОВЛЕНИЕ предназначено для одновременного обновления сотен записей, но оно не будет выполнено, если будет встречен один ноль. Также обратите внимание, что использование функции ISNULL () и установка значения на ноль недопустимы. Я хотел бы, чтобы запись была удалена, если ноль встречается. Заранее большое спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 28 мая 2010

Предполагая, что вы имеете в виду, оставьте значение без изменений, когда с нулями встречается "Я хотел бы, чтобы запись была удалена, если с нулем встречаются."

UPDATE TableA
SET Value = isnull(a.Value * b.AnotherValue, a.value)
FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true);

Если вы действительно хотите удалить строки и используете SQL 2008 или более позднюю версию, попробуйте оператор слияния.

MERGE TableA AS target 
USING TableB as source ON (target.ID = Source.ID)
WHEN MATCHED AND TableB.AnotherValue Is Null THEN DELETE
WHEN MATCHED THEN UPDATE SET target.Value = Target.Value * Source.AnotherValue;
0 голосов
/ 29 мая 2010

Это можно сделать просто в двух утверждениях:

UPDATE TableA
SET Value = a.Value * b.AnotherValue
FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true) and (a.Value * b.AnotherValue) is not null;

Delete a FROM TableA AS a
INNER JOIN TableB AS b
WHERE (Condition is true) and (a.Value * b.AnotherValue) is null;

Это самое простое решение.

Вы можете начать делать более сложные вещи (транзакции, временные таблицы, MERGE и т. Д.), Если ситуация не разрешена полностью.

0 голосов
/ 28 мая 2010

Вы не можете удалять строки во время обновления, вам понадобятся два оператора: удаление с последующим обновлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...