一尘不染

为什么Oracle不说GROUP BY表达式?

sql

我正在尝试使用以下条件从Oracle数据库表中检索数据

  1. 邮政编码中找到的所有条目均应分组,并按邮政编码降序排列。
  2. 按城市找到的条目应进行分组,并按字母顺序排序。
  3. 按经销商名称找到的所有条目均应分组,并按字母顺序排序。

为了满足上述条件,我编写了如下查询

SELECT DISTINCT ba.uuid AS uuid
        , COUNT(*) over() AS rowcount 
FROM basicaddress ba 
WHERE ba.postalcode='143456' 
OR ba.lastname LIKE '%143456%' 
OR ba.city LIKE '%143456%'
GROUP BY
    CASE WHEN ba.postalcode='143456' THEN ba.postalcode END 
ORDER BY 
    CASE WHEN ba.postalcode='143456' THEN ba.postalcode END DESC, 
    CASE WHEN ba.lastname LIKE '%143456%' THEN ba.lastname END ASC, 
    CASE WHEN ba.city LIKE '%143456%' THEN ba.city ELSE ba.postalcode END DESC

该查询在MYSQL中工作正常,但在oracle中说 “不是GROUP BY表达式”

任何帮助将不胜感激


阅读 163

收藏
2021-03-17

共1个答案

一尘不染

发生这种情况只是因为MySQL破坏了SQL的逻辑。

假设我们有表emp:

id ename dept
1  mark  10
2  John  10
3  Mary  10
4  Jane  20

和查询:

select dept, ename
from emp 
group by dept;

你会得到什么?您应该得到两行,因为有两个部门,但是查询要求输入ename。对于20清晰,但对于10而言,发动机应该返回什么?

它应该返回一个错误。无法猜测要给出的名字。Oracle记录了一个错误-
您的错误,但是MySQL获得了一个ename(不保证是哪个)。这具有误导性,并且可能会导致错误。

正确的查询将是:

select dept, max(ename) --the latest, alaphabeticaly
from emp 
group by dept;

--all enames and groups
select dept, ename 
from emp 
group by dept, ename;

纠正此部分后,您必须解决

COUNT(*) over() AS rowcount

部分。在Oracle AFAIK中,您不能将分析函数与group by查询混合使用。

2021-03-17