sql - oracle通过警告解码组

标签 sql oracle group-by

我有这个代码

for x_eo in ( select decode(mod(card_name_id,2),0,1,1,2) e_o, count(*) nr 
                        from  rp_Deck where session_id=p_session_id_in 
                       and position<=35 group by mod(card_name_id,2) )

我收到 sqldeveloper 警告,选择列表与分组依据不一致。 开发人员给了我解决方案:

select decode(mod(card_name_id,2),0,1,1,2) e_o, count(*) nr 
                        from  rp_Deck where session_id=p_session_id_in 
                       and position<=35 group by mod(card_name_id,2), card_name_id, 2, decode(mod(card_name_id,2),0,1,1,2) )

这两个group by有什么区别? 谢谢!

最佳答案

一般来说,当您在语句中使用 GROUP BY 时,所有值都必须是:

  • 常量;
  • 在聚合函数内;或
  • GROUP BY子句中。

SQL Developer 没有意识到 decode(value_mod_2,0,1,1,2) 实际上只是在值上加 1,并且不会更改项目到组的分配,因为它既不是常量也不是聚合函数,它期望整个函数位于 GROUP BY 子句中。

就我个人而言,我会把它写成:

select mod(card_name_id,2) + 1 e_o,
       count(*) nr 
from   rp_Deck
where  session_id=p_session_id_in 
and    position<=35
group by mod(card_name_id,2)

(+ 1 是一个常量,因此不需要位于 GROUP BY 子句中)

SQL Developer 提出的解决方案是错误的:

select decode(mod(card_name_id,2),0,1,1,2) e_o,
       count(*) nr 
from   rp_Deck
where  session_id=p_session_id_in 
and    position<=35
group by
       mod(card_name_id,2),
       card_name_id,
       2,
       decode(mod(card_name_id,2),0,1,1,2)

实际上与按最细粒度分组进行分组相同,因此:

group by card_name_id;

这不是您想要的分组依据。为了与原始查询的预期输出相同,它应该建议如下内容:

group by
       mod(card_name_id,2),
       decode(mod(card_name_id,2),0,1,1,2)

或更简单地说:

group by
       decode(mod(card_name_id,2),0,1,1,2)

关于sql - oracle通过警告解码组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49854937/

相关文章:

sql - DB2 SQL 根据权重选择不同的数据

sql - ORA-32033 : unsupported column aliasing : Oracle 10g

sql - 带有嵌套表的物化 View

oracle - 是否在不安装客户端的情况下检查Oracle监听器是否正在运行?

mysql - Sum 和 Group By 问题

sql - P/L SQL 中如何只转首字母大写其他字母小写?

sql - PostgreSQL - 显示上年+当年周数据

mysql - SQL:在一条语句中进行多个分组

sql - 有没有SQL + Redis Hybrid ORM/OHM框架?

mysql - 为什么 MySQL 与 SQLServer 的工作方式不同,允许使用 GROUP BY 子句的多列