Получение предупреждения об исключении пустых значений из SET, но нулевое значение отсутствует - PullRequest
0 голосов
/ 26 июня 2018

Я знаю, что означает это предупреждение, однако в этом случае точно нет нулевых значений.

Результат также кажется правильным, но предупреждение вызывает у меня любопытство (и обеспокоенность), поскольку это означает, что в игре есть что-то, чего я не понимаю.

Предупреждение:

Warning: Null value is eliminated by an aggregate or other SET operation.

Вот утверждение:

UPDATE Contacts
SET IsActiveCampaignClient = 1,
    NeedsActiveCampaignSync = 1
FROM (
    SELECT dbo.Contacts.ID
    FROM dbo.Contacts
        LEFT OUTER JOIN dbo.Order_Batches ON dbo.Order_Batches.EnteredByContactID = dbo.Contacts.ID
    GROUP BY dbo.Contacts.ID
    HAVING (COUNT(dbo.Order_Batches.ID) > 0)
    ) i
WHERE i.ID = Contacts.ID

Как вы можете видеть, это оператор UPDATE, в котором мне нужно было выполнить некоторую логику соединения, и проблема с оператором COUNT (). Но если я возьму этот вложенный SELECT и запусту его сам, в результате не будет нулевых значений:

ID
37
39
52
54
79
81

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

Итак, чтобы было ясно, я хотел бы понять, почему это сообщение появляется, но только когда запрос вложен в предложение FROM оператора UPDATE.

1 Ответ

0 голосов
/ 27 июня 2018

Не требуется агрегирование, если вы гарантируете, что контакт, по крайней мере, имеет заказ на его обновление. Вместо этого используйте EXISTS.

UPDATE c
SET IsActiveCampaignClient = 1,
    NeedsActiveCampaignSync = 1
FROM  Contacts c
WHERE exists (
  (
    SELECT 1   -- making sure there is at least an order
    FROM Order_Batches o
    where o.EnteredByContactID = c.ID
    ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...