在没有外部的情况下启动案例陈述'选择' - CTE' s

时间:2015-07-02 18:35:40

标签: sql oracle oracle11g common-table-expression

运行此查询(如下所示)会返回“过多的值”'错误:

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
;

这可行吗?这种语法显然不起作用,否则我不会问这个问题 - 但是有没有相关的方法可以做到这一点?

2 个答案:

答案 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;
  1. 使用内联视图替换公用表表达式。只有在多次引用CTE时才应使用它们。对于小例子而言,它们可能看起来更好一些,而程序员只使用过程代码。严重SQL需要多个嵌套级别的内联视图。如果没有CTE,调试就会轻松得多 - CTE很难突出显示和运行代码块。
  2. 用谓词替换案例表达式以按日期过滤。 CASE表达式只能返回单个值。你可能会对类型做一些奇特的事情,但这会非常复杂。我的代码仍然假设这两个集合返回相同类型的值。如果不是这样,你需要在应用程序级别做一些不同的事情。
  3. to_char替换为extract日期处理在Oracle中可能会造成混淆。诀窍是将所有内容保留在其原生类型中。除了格式化显示之外,您几乎不需要使用to_charto_date。对于任何其他操作,几乎可以肯定的是在不转换类型的情况下处理它的功能。
  4. 用ANSI语法,替换cross join ANSI样式语法有几个优点。一个主要的优点是它可以清楚地表明交叉连接是有意的。

答案 1 :(得分:0)

您没有为b指定加入条件。您实际上是将LetsSeeLetsSee子句的结果交叉加入from

from cmtmpentered t1 
    join cmtmpconf t2 on t1.casenumber = t2.casenumber and t1.enc = t2.enc

我建议您使用LetsSeet1加入t2

此外,您没有为对指定连接条件:

  • FirstReportGroupsFirstReportDetails
  • SecondReportGroupsSecondReportDetails