查询在没有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);
答案 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
进行比较的值
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中,并且它有效。感谢大家。呼!结果是准确的。