2014-12-24 58 views
2

爲什麼添加列到選擇列表和group by by查詢會增加返回的行數?例如,下面是我的基本查詢,但如果我添加列,我會返回更多的行。添加的列越多,返回的行就越多。看起來where子句條件應該是唯一控制返回的行的東西。爲什麼通過增加行來增加列返回

實例查詢:

select pobj_name, max(prev) prev 
from pfmc_part 
where pmodel in ('PN-DWG', 'NO-DWG') and pstatus = 'RELEASED' 
group by pobj_name 
order by pobj_name 

回答

1

當添加WHERE子句,它過濾設定接下來將流傳下來的GROUP BY行,所以WHERE施加之前基團。在GROUP BY被應用之前,將被分組並且將在其上執行像SUM(),MAX(),MIN(),COUNT()那樣的聚合的行已經被限於那些匹配WHERE條件的行。

至於爲什麼在將列添加到SELECTGROUP BY時獲得更多行 - 那麼,GROUP BY聚合就是如此工作的。如果您將其他列添加到SELECT中,則還必須對它們進行分組(大多數RDBMS中),並且只要行之間的值不同,它們將導致更多的分組行。

考慮一下這個表:

Name Score 
John 2 
Bill 3 
John 1 

GROUP BYNameJohn行摺疊成一個:

SELECT Name, SUM(Score) AS total 
FROM scores 
GROUP BY name 

Name total 
John 3 
Bill 3 

現在考慮這個表,這對於運動的另一列。在這裏,John有2個不同的運動代表,而比爾只有1個。要在SELECT列表中包括Name, Sport,他們必須都在GROUP BY。跨行類似的值塌陷成團,但現在John有套類似的價值觀,以組:

Name Sport Score 
John Baseball 3 
John Bowling 9 
Bill Baseball 10 
Bill Baseball 6 
John Bowling 12 

SELECT Name, Sport, SUM(Score) AS total 
FROM scores 
GROUP BY Name, Sport 

Name Sport total 
John Baseball 3 
John Bowling 21 
Bill Baseball 16 

因此增加額外的列到GROUP BY將導致更多的輸出行如果列跨越具有不同的價值觀行。

應用一個WHERE子句第二個表,尋找只John行,將消除所有Bill應用組。結果將是兩行。

SELECT Name, Sport, SUM(Score) AS total 
FROM scores 
-- Filter with a WHERE clause this time 
WHERE Name = 'John' 
GROUP BY Name, Sport 

-- Results in only John's rows 
Name Sport Score 
John Baseball 3 
John Bowling 21 
+0

我現在明白了。優秀的解釋,謝謝! – wallenpb

0

考慮表StudentScores:

+-----------+------------+-------+ 
| Last_Name | First_Name | Score | 
+-----------+------------+-------+ 
| Smith  | Bob  | 90 | 
| Smith  | Bob  | 85 | 
| Smith  | Alice  | 100 | 
| Smith  | Alice  | 90 | 
| Johnson | Evelyn  | 80 | 
| Johnson | Evelyn  | 85 | 
+-----------+------------+-------+ 

這個查詢:

SELECT Last_Name, MAX(Score) Score 
FROM StudentScores 
GROUP BY Last_Name 

結果:

+-----------+-------+ 
| Last_Name | Score | 
+-----------+-------+ 
| Smith  | 100 | 
| Johnson | 85 | 
+-----------+-------+ 

然而,這個查詢:

SELECT Last_Name, MAX(Score) Score 
FROM StudentScores 
GROUP BY Last_Name, First_Name 

結果:

+-----------+-------+ 
| Last_Name | Score | 
+-----------+-------+ 
| Smith  | 90 | 
| Smith  | 100 | 
| Johnson | 85 | 
+-----------+-------+ 

那麼,有什麼不同?那麼,'Smith'是兩者的Last_Name學生:

SELECT Last_Name, First_Name, MAX(Score) Score 
FROM StudentScores 
GROUP BY Last_Name, First_Name 

結果:

+-----------+------------+-------+ 
| Last_Name | First_Name | Score | 
+-----------+------------+-------+ 
| Smith  | Bob  | 90 | 
| Smith  | Alice  | 100 | 
| Johnson | Evelyn  | 85 | 
+-----------+------------+-------+ 
+0

很好的例子,謝謝! – wallenpb

0

添加一個新組通過增加你看beacuase每個group by分區以另一種方式的數據結果的數量。

如果你只使用聚合函數,你只能得到一個單行結果,更精細你組數據中出現的結果行,你會看到

where子句控制輸入由分組perfomed group by。如果存在having子句將控制返回給用戶的結果。

+0

是的,我現在明白了。非常感謝答覆。 – wallenpb