2015-12-14 80 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所指出的那樣,這並不是必需的。