Sql-Server
為什麼 GROUP BY 語句中的萬用字元不起作用?
我正在嘗試使以下 SQL 語句工作,但出現語法錯誤:
SELECT A.*, COUNT(B.foo) FROM TABLE1 A LEFT JOIN TABLE2 B ON A.PKey = B.FKey GROUP BY A.*
在這裡,A 是一個有 40 列的寬表,如果可能,我想避免在 GROUP BY 子句中列出每個列名。我有很多這樣的表,我必須在上面執行類似的查詢,所以我必須編寫一個儲存過程。解決這個問題的最佳方法是什麼?
我正在使用 MS SQL Server 2008。
GROUP BY A.*
在 SQL 中是不允許的。您可以使用分組依據的子查詢繞過此問題,然後加入:
SELECT A.*, COALESCE(B.cnt, 0) AS Count_B_Foo FROM TABLE1 AS A LEFT JOIN ( SELECT FKey, COUNT(foo) AS cnt FROM TABLE2 GROUP BY FKey ) AS B ON A.PKey = B.FKey ;
SQL-2003 標準中有一個特性允許
SELECT
列表中的列不在GROUP BY
列表中,只要它們在功能上依賴於它們。如果該功能已在 SQL-Server 中實現,則您的查詢可以編寫為:SELECT A.*, COUNT(B.foo) FROM TABLE1 A LEFT JOIN TABLE2 B ON A.PKey = B.FKey GROUP BY A.pk --- the Primary Key of table A
不幸的是,這個功能還沒有實現,甚至在 SQL-Server 2012 版本中也沒有實現——據我所知,在任何其他 DBMS 中都沒有。除了 MySQL 有它但不充分(不足為:上面的查詢可以工作,但引擎不會檢查功能依賴,其他寫得不好的查詢會顯示錯誤的、半隨機的結果)。
正如@Mark Byers在評論中告訴我們的那樣,**PostgreSQL 9.1 添加了一個**為此目的而設計的新功能。它比 MySQL 的實現更嚴格。