2015-12-14 76 views
0

是否有添加DISTINCT会改变使用GROUP BY子句的SELECT查询的结果的情况?使用GROUP BY子句时,SELECT DISTINCT是否总是冗余?

Group by and distinct produce similar execution plans.

从我的理解,使用GROUP BY子句只能从GROUP BY或聚合函数列的表。

List of aggregate functions似乎是确定性的,GROUP BY的组合是唯一的,所以我的假设是它是多余的。

编辑1:在SELECT之后直接添加DISTINCT关键字。查询中没有任何地方像@ lad2025的例子:SELECT name,COUNT(DISTINCT col)... GROUP BY名称。

SELECT name, COUNT(col) AS result 
FROM table 
GROUP BY name 

VS

SELECT name, COUNT(DISTINCT col) AS result 
FROM table 
GROUP BY name 

在其他情况下,如::

回答

3

您没有义务SELECT所有的GROUP BY列,所以在这种情况下,它会改变结果。

SELECT COUNT(*) 
FROM sys.objects 
GROUP BY schema_id, name 

---或

SELECT DISTINCT COUNT(*) 
FROM sys.objects 
GROUP BY schema_id, name 
0

是,它可以在您使用DISTINCT与聚合功能改变结果

SELECT DISTINCT name 
FROM table 
GROUP BY name 

DISTINCT几乎总是多余。

编辑:

角情况下(当GROUP BYSELECT列列表不匹配):

CREATE TABLE #tab(col1 INT, col2 INT); 

INSERT INTO #tab 
VALUES (1,1), (1,1), (2,1), (2,2) 

SELECT DISTINCT col2 
FROM #tab 
GROUP BY col1, col2 

SELECT col2 
FROM #tab 
GROUP BY col1, col2; 

​​3210

输出:

╔══════╗     ╔══════╗ 
║ col2 ║     ║ col2 ║ 
╠══════╣  vs   ╠══════╣  
║ 1 ║     ║ 1 ║   
║ 2 ║     ║ 1 ║   
╚══════╝     ║ 2 ║ 
         ╚══════╝ 
1

基团,如通过显示的group by子句中的表达和列定义,将在结果集中是唯一的。只要所有这些列都包含在select列表中,则distinct将是多余的。正如Martin Smith所指出的那样,这并不是必需的。