2010-10-12 86 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