2017-01-27 107 views
1

只是好奇爲什麼我真的必須指定一個group by子句,因爲如果我使用一個函數,那些請求者一個group by子句(不記得那些函數的通用名稱),例如。和()。meta:爲什麼我必須指定一個group by子句

因爲如果我使用其中之一,我必須指定在group by子句中不使用其中一列的每一列。

爲什麼sql不會自動將所有不使用聚合函數的列分組?這似乎是多餘的,因爲只要我使用聚合,我在所有其他不使用它的列上進行分組。

+0

我會想象避免意外的行爲,讓用戶更容易。但是,對於給定的SQL悠久的歷史以及您無法真正做任何事情來改變當前的情況,您並不是真的會得到合適的答案。 – iamdave

+0

是的。只是想知道是否有人可以證明tsql語言的設計選擇。有沒有什麼地方我不必指定我的分組列? – user3532232

+0

你*總是*必須指定你的分組列。 – iamdave

回答

1

可能出於同樣的原因,C編譯器不會自動假定並插入變量聲明(如果使用的是以前未聲明的變量聲明)。有編程語言可以完成這種事情,SQL不是其中之一。

另一方面,編輯可能會意識到這一點,並至少自動完成語法的功能相關部分。默認情況下,Oracle SQL開發人員在檢測到您正在編寫需要它的選擇列列表時,會默認自動附加GROUP BY子句。海事組織這是一個痛苦,我通常保持關閉,但它會盡可能 - 在IDE /編輯器級別。

編輯:根據您最近的評論,在MySQL(不是微軟的T-SQL)中有一個選項,旨在通過實現標準SQL99的可選功能T301來放寬規則。我認爲這正是你所追求的:

MySQL 5.7.5及更高版本實現檢測功能依賴。如果啓用了ONLY_FULL_GROUP_BY SQL模式(默認情況下),MySQL會拒絕選擇列表,HAVING條件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依賴於它們的非聚合列的查詢。

來源:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

找不到對T-SQL的未來版本中此功能的狀態多的信息,雖然。唯一的參考是this,與T-SQL將「部分支持此功能」的含義非常模糊。

+0

好的。很酷,知道你不需要它在MySQL中。沒有什麼,我真的很困擾它,似乎是在語言中的冗餘設計 – user3532232

相關問題