得到有关从SET中消除空值的警告,但没有空值

时间:2018-06-26 20:38:16

标签: sql-server tsql sql-update

我知道此警告的含义,但是在这种情况下,绝对没有空值。

结果似乎也是正确的,但是警告使我感到好奇(和担忧),因为这意味着我在理解某些事情。

警告是:

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并单独运行它,结果中将没有null:

ID
37
39
52
54
79
81

我认为关于嵌套选择的工作方式有些我不了解的事情。我尝试查看执行计划,并以各种方式将其分开以揭示空值或其他问题。我尝试对语句进行调整,以尝试使null出现-不用运气。

因此,很明显,我想理解为什么会出现此消息,但是仅当查询嵌套在UPDATE语句的FROM子句中时才发生。

1 个答案:

答案 0 :(得分:1)

如果您确保联系人至少有一个订单来更新此订单,则不需要汇总。请改用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
    )