问题:
为什么
select *
from (select * from A where a = 'xx' order by A.b desc) t
group by a
这个sql不报错,
select * from (SELECT *
FROM B
ORDER BY B.a desc) t group by B.c,B.d
这个sql报错,都是有多条记录的情况下
原因:
A表包含多个字段,上述的第一个 SQL 查询可能不会报错,这主要取决于使用的数据库管理系统(DBMS)及其配置。一些数据库系统(如 MySQL)在默认情况下允许这样的查询,即使它并不完全符合 SQL 标准。
在标准的 SQL 中,当使用 GROUP BY 时,应该只选择那些包含在 GROUP BY 子句中的列或使用聚合函数的列。然而,MySQL 在某些配置下会放宽这一限制,允许选择其他列,此时对于非分组列,它会返回每个分组中的任意值(这通常是分组中的第一个值)。这种行为可能会导致不确定的结果,因为不知道会返回哪一行的数据。
如果在使用 MySQL,并且没有启用 ONLY_FULL_GROUP_BY 选项,那么第一个查询就不会报错,即使 SELECT * 选择了所有列,而 GROUP BY 仅按 MEMBER_ID 分组。但是,如果启用了 ONLY_FULL_GROUP_BY,这个查询就会报错,因为它违反了 SQL 的分组规则。
第一个查询在某些数据库配置下可能不报错,但这并不意味着它是一个好的或正确的查询。为了避免潜在的问题和不确定性,最好始终遵循 SQL 的标准规则。