【问题标题】:ORA-00979 ORA-22818ORA-00979 ORA-22818
【发布时间】:2016-08-25 05:38:48
【问题描述】:

查询可以在没有 case 语句的情况下工作。在我添加 CASE 语句后, 为下面的查询获取 ORA-00979(不是 GROUP BY 表达式)(因为我没有在 GROUP BY 子句中添加 case 语句)。 在我尝试之后(添加到 Group By),我得到了 ORA-22818(此处不允许子查询表达式)。有什么建议吗?

注意:所有左外连接都是引用表 表:d_r_o og 是主 DIM 表。

case 语句是返回特定数据条件的时间戳条件。

select nvl(country_name,'unknown_cntry') CNTRY_NAME, 
       nvl(rs.reg_tp_nm,'rgs_stus') RG_STUS,
       nvl(REBTN,'u_B_type') B_type_nm,
       decode(to_char(og.TIMESTAMP, 'YYYY'),
                '2015', 'CCCASE',
                        'CURRENT'),
       count(dkey),
       (CASE
          WHEN PG.rite_ts <= (SELECT pssd_dt
                                FROM lpyr
                                WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)
            THEN 'RECTIFIED'
          ELSE 'no'
        END) RCT_STUS,
  FROM d_r_o og
  left outer join LORSR rs
    on og.key = rs.key
  left outer join LRBR br
    on og.key = br.key
  left outer join LUST st
    on og.key = st.key
  group by nvl(country_name,'unknown_cntry') CNTRY_NAME, 
           nvl(rs.reg_tp_nm,'rgs_stus') RG_STUS,
           nvl(REBTN,'u_B_type') B_type_nm,
           decode(to_char(og.TIMESTAMP, 'YYYY'),
                    '2015', 'CCCASE',
                            'CURRENT'),
           count(dkey);

【问题讨论】:

  • 不知道您的模型,您是否有理由不与所有其他表一起加入“lpyr”?然后只需比较 case 语句中的值。
  • 请编辑您的问题并包含您看到的错误消息的确切文本。谢谢。
  • 如果您按每个结果列分组,您不妨删除group by 并添加distinct。它会更短,更容易理解。当然,也许您不是有意将 count(dkey) 放在 group by 中,因为在 group by 中使用聚合函数似乎会适得其反。
  • @贾斯汀·凯夫。 LPYR 是定义计划年份的参考表。
  • @ Bob Jarvis - 完成!谢谢。

标签: oracle ora-00979


【解决方案1】:

对于您的ORA-22818 错误,您应该更改此设置

 when PG.rite_ts <= (SELECT pssd_dt FROM lpyr WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)

因为子查询表达式 SELECT pssd_dt 可能返回很多行,而不是一个值与PG.rite_ts 比较

一个解决方案应该是使用min(或max?)函数

when PG.rite_ts <= (SELECT min(pssd_dt) FROM lpyr WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)

【讨论】:

  • 谢谢 Pham X。试过了。不工作。同样的错误。
  • 如图,注释掉整个case语句,查询成功。
【解决方案2】:

感谢您的意见。我能够使用您的每一条反馈来弄清楚它。 我几乎从案例中删除了 lpyr 并将其作为另一个左外连接放在 from 语句中。

然后我将 CASE 语句替换为: (案子 当 PG.rite_ts 然后“纠正” 否则“不” 结束)

我还将这个 CASE 语句添加到 Group by Clause 中并且它起作用了。感谢大家。哇!!!结果准确。

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2014-12-24
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2019-09-08
    • 2011-05-25
    相关资源
    最近更新 更多