我知道此警告的含义,但是在这种情况下,绝对没有空值。
结果似乎也是正确的,但是警告使我感到好奇(和担忧),因为这意味着我在理解某些事情。
警告是:
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子句中时才发生。
答案 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
)