甲骨文解码组发出警告



我有这个代码

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条款中。

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)

最新更新