2010-10-12 54 views
2

我试图返回两列列彼此不相等的查询结果。返回不等于两行的值

但是,当我运行查询时,结果似乎与实际数据不一致。

正如你在下面看到的,我想返回RatePlanIDs不同的行。

RatePlans_Supplemental.PIDs实际上可以为null,但我从不会看到空结果。它也返回重复。

我已经尝试了这种多重查询,他们似乎都做同样的事情。

我已经验证了它返回了错误的数据。这就像查询插入值,如果有一个空值。任何想法为什么?

Update Billing_UnitUsage 
Set SuppRateSuccess = 0 
FROM   Billing_UnitUsage INNER JOIN 
         RatePlans_Supplemental ON Billing_UnitUsage.SupplementalRateID = RatePlans_Supplemental.UDC_ID AND 
         NOT(Billing_UnitUsage.RatePlanID = RatePlans_Supplemental.PIDs) 

回答

4

空是“未知”。任何针对未知的函数(包括NOT)都返回未知。为了获得一行返回,您的标准必须返回TRUE。使用IS NULLIS NOT NULL来测试NULL。

这是我的比喻。

如果房间里有两个陌生人,你问,他们的名字是一样的吗?答案是未知的。

如果你问,他们的名字是不一样的?答案是未知的。

不知道他们的名字,不幸的是,答案始终未知。

+0

+1 - 如果您没有良好的商业理由***允许空值,请不要允许它们,或将它们转换为空字符串/ 0。 – JNK 2010-10-12 19:15:40

+0

许多人认为NULL意味着空,但事实并非如此。它意味着“未知”。正如@JNK指出的那样,用空作为空。 – 2010-10-12 19:25:55

+0

伟大的信息。谢谢! – Infotech 2010-10-12 21:06:23

1

我添加了表别名,以提高可读性。

如果你不想更新SuppRateSuccessPIDs为NULL:

Update bu 
Set SuppRateSuccess = 0 
    FROM Billing_UnitUsage bu 
     INNER JOIN RatePlans_Supplemental rs 
      ON bu.SupplementalRateID = rs.UDC_ID 
    WHERE bu.RatePlanID <> ISNULL(rs.PIDs, bu.RatePlanID) 

如果你想更新SuppRateSuccessPIDs是NULL(假设RatePlanID <> 0):

Update bu 
Set SuppRateSuccess = 0 
    FROM Billing_UnitUsage bu 
     INNER JOIN RatePlans_Supplemental rs 
      ON bu.SupplementalRateID = rs.UDC_ID 
    WHERE bu.RatePlanID <> ISNULL(rs.PIDs, -bu.RatePlanID) 
+0

感谢您的信息。在阅读本书之前,我从来没有想过这件事,但我想我没有必要在失败时设置它。它不会被设置,我可以运行一个查询基于此。你对表的别名也是正确的。我接管了这个项目,原来的开发者没有使用它们,但是当我不懒惰时,我正在慢慢更新它们。 – Infotech 2010-10-12 21:08:35