我有这个代码
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/