1 1 T2Text1 NULL
2 NULL T2Text2 NULL
3 3 T2Text3 120.0000
4 1 T2Text4 123.0000
5 1 T2Text5 234.0000
6 3 T2Text6 345.0000
NULL NULL NULL NULL
有三行數據T1ID列的值是1,其中有一行的Amount值是NULL。有兩行數據的T1ID值是3,這兩行數據的Amount值都不為空(你還可以增加更多的行,但要確保行數目和Amount列為NULL的數目也不同)。
現在,運行下面的查詢語句:
SELECT InnerOuter.T1.T1ID,
Sum(InnerOuter.T2.Amount)AS TotalAmount,
Count(InnerOuter.T2.T1ID)AS NumberOfRows,
Count(InnerOuter.T2.Amount)AS NumberOfAmounts,
Avg(InnerOuter.T2.Amount)AS AverageAmount
FROM InnerOuter.T1 LEFT OUTER JOIN
InnerOuter.T2 ON InnerOuter.T1.T1ID = InnerOuter.T2.T1ID
GROUP BY
InnerOuter.T1.T1ID
結果如下:
1 357.00 3 2 178.50
2 NULL 0 0 NULL
3 465.00 2 2 232.50
第一行的返回結果表明:如果按照T1ID列統計,你將得到正確的行數,但是如果是按照Amount列統計,得到的將是非NULL值的行數。需要注意的是:平均值是按照非NULL值的數目進行計算的,而不是總行數。
你可能會認為這些事例并不真實,因為表格之間的聯系都是人為給定的。并且在實際中,似乎不允許外關鍵字為NULL。然而,我的確在數據庫中發現存在著這樣的情況。例如,HR招聘了一名新雇員,但是還沒有安排他的工作部門;又例如,我們將一名客戶加入到數據庫中,但是還沒為其安排一名銷售代表。
有很多方法處理類似這樣信息缺失的情況。在我看來,最糟糕的處理方法就是在添加所謂的0th行,當外關鍵字是NULL時,就使用0值來代換。這樣,外關鍵字就永遠不會是NULL。這一方法會造成兩個問題:1)通過向數據表中引進一種新的數據類型,從概念上偽造了一個數據實體。然而關系數據庫認為數據表中都是確實存在的數據類型;2)它將查詢操作的處理變得更加的復雜化,因為你要將查詢結果中含0的這些行刪除。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/