SELECT *FROM biz_technology_config GROUP BY conf_grp_num HAVING COUNT(conf_grp_num) > 1;这个不行吗
时间: 2025-09-06 12:46:17 AIGC 浏览: 10
你写的 SQL:
```sql
SELECT * FROM biz_technology_config
GROUP BY conf_grp_num
HAVING COUNT(conf_grp_num) > 1;
```
在 **大多数数据库系统(如 MySQL 5.7+、PostgreSQL、Oracle)中是不合法的**,会报错或返回不可预测的结果。
---
## ❌ 原因分析:
### ✅ SQL 标准规定:
当你使用 `GROUP BY` 时,`SELECT` 后面的字段只能是:
- 聚合函数(如 `COUNT()`, `MAX()`, `MIN()` 等)
- 或者是 `GROUP BY` 中包含的字段
你用了 `SELECT *`,表示要返回所有字段,但这些字段并没有出现在 `GROUP BY` 子句中,数据库不知道该返回每组中的哪一行数据,因此不支持。
---
## ✅ 正确做法:
### ✅ 方法一:查找重复的 `conf_grp_num`(只返回分组字段)
```sql
SELECT conf_grp_num
FROM biz_technology_config
GROUP BY conf_grp_num
HAVING COUNT(conf_grp_num) > 1;
```
---
### ✅ 方法二:查找所有重复 `conf_grp_num` 的完整记录
```sql
SELECT t.*
FROM biz_technology_config t
INNER JOIN (
SELECT conf_grp_num
FROM biz_technology_config
GROUP BY conf_grp_num
HAVING COUNT(conf_grp_num) > 1
) dup ON t.conf_grp_num = dup.conf_grp_num
ORDER BY t.conf_grp_num;
```
---
## ✅ 如果你只想查看每组中的一条记录(比如最大 id 的那条),可以这样写:
```sql
SELECT t.*
FROM biz_technology_config t
INNER JOIN (
SELECT conf_grp_num, MAX(id) AS max_id
FROM biz_technology_config
GROUP BY conf_grp_num
HAVING COUNT(conf_grp_num) > 1
) dup ON t.conf_grp_num = dup.conf_grp_num AND t.id = dup.max_id;
```
---
## ✅ MySQL 特例说明:
在 **MySQL 5.7 及以前版本中**,某些配置下允许 `SELECT * ... GROUP BY`,但返回的非分组字段值是**不确定的**,可能来自组内的任意一条记录,**不推荐使用**。
从 **MySQL 5.7+ 和 8.0+** 开始,默认配置下也会报错。
---
###
阅读全文
相关推荐


















