ORA-00979 ORA-22818

时间:2016-04-29 23:12:22

标签: oracle ora-00979

查询在没有case语句的情况下工作。我添加CASE语句后, 为下面的查询获取ORA-00979(不是GROUP BY表达式)(因为我没有将case语句添加到GROUP BY子句)。 在我尝试之后(添加到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);

2 个答案:

答案 0 :(得分:0)

对于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)

答案 1 :(得分:0)

感谢投票人员。我能够通过你的每一个反馈来解决这个问题。 我几乎从案例中删除了lpyr,并将它作为另一个左外连接放在from语句中。

然后我将CASE语句替换为: (案件           当PG.rite_ts&lt; = lpyr.pssd_dt
时             然后&#39;经过修复&#39;           ELSE&#39; no&#39; END)

我还通过Clause将此CASE声明添加到Group中,并且它有效。感谢大家。呼!结果是准确的。