Sql-Server

為什麼 GROUP BY 語句中的萬用字元不起作用?

  • October 22, 2021

我正在嘗試使以下 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 的實現更嚴格。

引用自:https://dba.stackexchange.com/questions/21226