2011-06-17 35 views
3

我有這樣的查詢:GROUP BY語句中以逗號分隔的整數是什麼完成的?

SELECT col1, col2, col3, col4, col5, SUM(col6) AS total 
FROM table_name 
WHERE col1 < 99999 
GROUP BY 1,2,3,4,5 

什麼是GROUP BY聲明實際上完成嗎?沒有逗號分隔的整數,查詢不能正常工作。

+0

您通常不允許直接選擇不在GROUP BY中的列。我假設1,2,3等實際上是你的列名? – 2011-06-17 00:06:24

+2

什麼數據庫產品和版本?您的DBMS可能支持通過位置引用列的專有功能。不過不推薦。 – Thomas 2011-06-17 00:08:41

+0

同意@sam dufel如果這是確切的查詢...否則可能是列別名。否則,您的查詢可能會錯誤地表明您必須將select中的列包含在group by中。 – Rahul 2011-06-17 00:09:16

回答

5

它相當於寫作:

SELECT col1, col2, col3, col4, col5, SUM(col6) AS total 
    FROM table_name 
WHERE col1 < 99999 
GROUP BY col1, col2, col3, col4, col5 

的號碼被值/通過在列表中序數位置,表示在選擇列表列從1開始

的數字用來強制;那麼添加了在選擇列表中使用表達式的功能。表達式可能會變得笨拙,並且並非所有DBMS都允許您使用GROUP BY子句中的選擇列表中的「顯示標籤」或「列別名」,所以偶爾使用列號會有幫助。

在您的示例中,最好使用名稱 - 它們很簡單。而且,一般來說,只要可以,就使用名稱而不是數字。

+0

僅供參考:我確定只有MySQL允許這個廢話當前 – gbn 2011-06-17 05:13:27

+0

@gbn:哪個廢話? SQL標準仍然需要它,AFAIK。我幾乎可以肯定,SQL-86標準只提供了編號列符號。延伸到目前爲止的產品(DB2,Informix,Oracle,Sybase,Ingres,SQL Server等)可能會支持編號表示法。我可以肯定地回答Informix;它確實允許編號列。你知道哪些DBMS不支持它? – 2011-06-17 05:23:22

+0

@gbn:話雖如此,我已經看過了[SQL-92](http://www.savage.net.au/SQL/)語法,但不清楚它允許列號,所以也許我誤解了。這個符號來自最初的IBM SQL(事實上)規範,並且在20世紀80年代早期到中期,這些系統作爲「事實上的」標準。 – 2011-06-17 05:31:28

1

樣的相同的查詢試圖在MS SQL Server 2005

select distinct host from some_table group by 1,2,3 

它錯誤的出說

Each GROUP BY expression must contain at least one column that is not an outer reference. 

因此,這表明這些1,2,3卻都列外referrence

3

我的猜測是,你的數據庫產品允許按組的位置引用列,而不是僅按列名引用(即第一列爲1) ,2爲第二列等)如果是這樣,這是一個專有功能,不推薦,因爲可移植性和(可論證)可讀性問題(但可以承認,方便快捷和骯髒的查詢)。