2010-06-04 31 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