首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL GROUP BY 多字段分組查詢結果解析與 Oracle/MySQL 差異詳解

     編輯:程式設計綜合問答

測試數據準備

CREATE TABLE Ad_inf (_id INT, name VARCHAR(20), describe VARCHAR(20));
INSERT INTO Ad_inf VALUES 
(1,'test1','d1'), (2,'test2','d2'), (3,'test2','d2'),
(4,'test2','d3'), (5,'test3','d2'), (6,'test4','d4');

標準 SQL 行為 (MySQL/PostgreSQL/SQL Server)

SELECT * FROM Ad_inf GROUP BY name, describe;

結果:返回 5 行(去重後的唯一組合)

_idnamedescribe
1test1d1
2test2d2
4test2d3
5test3d2
6test4d4

注意:_id 取每組第一條記錄的值(非確定性)

Oracle/標準 SQL 模式報錯

ORA-00979: not a GROUP BY expression

原因:SELECT 列表中非聚合列必須出現在 GROUP BY 中

正規寫法(跨數據庫兼容)

方案一:僅選分組字段

SELECT name, describe FROM Ad_inf GROUP BY name, describe;

方案二:聚合函數處理其他字段

SELECT MIN(_id) as first_id, name, describe 
FROM Ad_inf GROUP BY name, describe;

方案三:窗口函數 (現代 SQL)

SELECT _id, name, describe
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY name, describe ORDER BY _id) as rn
  FROM Ad_inf
) t WHERE rn = 1;

實戰建議

  • 生產環境禁用 SELECT * 配合 GROUP BY
  • 明確指定聚合邏輯:MIN/MAX/COUNT/GROUP_CONCAT
  • MySQL 設置 sql_mode=ONLY_FULL_GROUP_BY 強制規範
查詢結果截圖 錯誤示例
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved