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