运行此查询(如下所示)会返回“过多的值”'错误:
select
case
when to_char(sysdate, 'yyyymmdd') = to_char(sysdate, 'yyyymm') || '01'
then (select FirstReportGroups.*, FirstReportDetails.*
from FirstReportGroups, FirstReportDetails)
when to_char(sysdate, 'yyyymmdd') = to_char(sysdate, 'yyyymm') || '16'
then (select SecondReportGroups.*, SecondReportDetails.*
from SecondReportGroups, SecondReportDetails)
end as LetsSee
from cmtmpentered t1 join cmtmpconf t2
on t1.casenumber = t2.casenumber
and t1.enc = t2.enc
;
我正在使用CTE(它们不包括在内,因为它会使这个很长)并且它对我来说具有逻辑意义,但是在谷歌上搜索“太多价值观”#39;错误给了我没有实质性的帮助。单独运行CTE可以解决问题。
我认为如果我只能摆脱外界并且选择'声明并只保留Case中的选择。如果我解释得不好,我正在寻找的一个例子是:
case
when to_char(sysdate, 'yyyymmdd') = to_char(sysdate, 'yyyymm') || '01'
then (select FirstReportGroups.*, FirstReportDetails.*
from FirstReportGroups, FirstReportDetails)
when to_char(sysdate, 'yyyymmdd') = to_char(sysdate, 'yyyymm') || '16'
then (select SecondReportGroups.*, SecondReportDetails.*
from SecondReportGroups, SecondReportDetails)
end as LetsSee
;
这可行吗?这种语法显然不起作用,否则我不会问这个问题 - 但是有没有相关的方法可以做到这一点?
答案 0 :(得分:1)
select FirstReportGroups.*, FirstReportDetails.*
from (select 1 a from dual) FirstReportGroups
cross join (select 2 b from dual) FirstReportDetails
where extract(day from sysdate) = 1
---------
union all
---------
select SecondReportGroups.*, SecondReportDetails.*
from (select 3 a from dual) SecondReportGroups
cross join (select 4 b from dual) SecondReportDetails
where extract(day from sysdate) = 16;
to_char
替换为extract
。日期处理在Oracle中可能会造成混淆。诀窍是将所有内容保留在其原生类型中。除了格式化显示之外,您几乎不需要使用to_char
或to_date
。对于任何其他操作,几乎可以肯定的是在不转换类型的情况下处理它的功能。,
替换cross join
。 ANSI样式语法有几个优点。一个主要的优点是它可以清楚地表明交叉连接是有意的。答案 1 :(得分:0)
您没有为b
指定加入条件。您实际上是将LetsSee
与LetsSee
子句的结果交叉加入from
:
from cmtmpentered t1
join cmtmpconf t2 on t1.casenumber = t2.casenumber and t1.enc = t2.enc
我建议您使用LetsSee
或t1
加入t2
。
此外,您没有为对指定连接条件:
FirstReportGroups
和FirstReportDetails
SecondReportGroups
和SecondReportDetails