2010-06-04 29 views
1

在下面的SQL語句中,我應該使用DISTINCT,因爲我在Where Where子句中有一個Group By?思考?使用不同還是不是

SELECT [OrderUser].OrderUserId, ISNULL(SUM(total.FileSize), 0), ISNULL(SUM(total.CompressedFileSize), 0) 
FROM 
(
SELECT DISTINCT ProductSize.OrderUserId, ProductSize.FileInfoId, 
CAST(ProductSize.FileSize AS BIGINT) AS FileSize, 
CAST(ProductSize.CompressedFileSize AS BIGINT) AS CompressedFileSize 
FROM ProductSize WITH (NOLOCK) 
INNER JOIN [Version] ON ProductSize.VersionId = [Version].VersionId 
) AS total RIGHT OUTER JOIN [OrderUser] WITH (NOLOCK) ON total.OrderUserId = [OrderUser].OrderUserId 
WHERE NOT ([OrderUser].isCustomer = 1 AND [OrderUser].isEndOrderUser = 0 OR [OrderUser].isLocation = 1) 
AND [OrderUser].OrderUserId = 1 
GROUP BY [OrderUser].OrderUserId 
+2

取決於您之後的結果集。你在做什麼? – 2010-06-04 14:08:13

+0

類型的脫離主題,但是必須加入版本JOIN?你似乎沒有在任何地方使用它。是否有版本中不存在的ProductSize.VersionId?如果不是的話,你可能會帶來多個結果,因爲只有連接才能完全不必要地使用DISTINCT再次刪除它們。 – 2010-06-04 14:33:53

+0

當你刪除DISTINCT時,你會得到不同的結果嗎? – HLGEM 2010-06-04 15:00:55

回答

4

由於問題沒有儘可能寫得清晰,因此我假定您問的是distinct是否因group by存在而無關。

如果由於inner join而導致內部查詢返回多條記錄,那麼您需要在那裏有一個distinct。否則,right outer join將加入比您打算的記錄更多的記錄,並且諸如SUM()之類的內容不會返回相同的值。因此DISTINCT不是無關的。

0

您是否看過執行計劃以查看是否存在DISTINCT或不存在差異?這應該回答你的問題。

2

因爲我們不知道你要完成什麼,這可能不適用,但是......

如果你要使用連接時出現冗餘行,添加之前在DISTINCT中,您應該仔細檢查您的ON條件以確保您已將表格連接起來。如果測試不夠具體,你可能會允許額外的行匹配不應該。

+2

是的。經常DISTINCT是我認爲的一點代碼味道。 – 2010-06-04 14:35:21