【问题标题】:Outer join in decode in sql conditionsql条件下解码中的外连接
【发布时间】:2014-12-31 18:12:53
【问题描述】:

我正在从表 table_a 中获取列最新控制号。如果此表中没有员工的行,则它应该返回 null。为此我创建了一个查询

table_a

control_num emp_num  approv_begin_date approv_end_date prov_end_date prov_begin_date
1           10        30-NOV-2014       30-JAN-2014     30-NOV-2014       30-JAN-2014  

table_b

EMP_NUM  NAM
10       XYZ
20       ABC

我创建了一个查询:-

select nam,control_num
from table_a a,table_b b
where sysdate between approv_begin_date(+) and approv_end_date(+)

这给了我正确的输出

nam control_num
10  1
20  

现在条件发生了变化,我还必须考虑 prov_end_date 以防批准日期为空...... 为此,我创建了以下条件

   select nam,control_num
    from table_a a,table_b b
    where sysdate between DECODE (approv_begin_date
,                NULL, a.prov_begin_date
,                a.approv_begin_date)and DECODE (approv_end_date
,                NULL, a.prov_end_date
,                a.approv_end_date)

this will just give me :
  nam control_num
    10  1

我如何在这里使用外部连接?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这是建立在星期四的答案之上的。我认为查询更清晰:

    select nam, control_num
    from table_b b left join
         table_a a
         on b.emp_num = a.emp_num and
            sysdate between coalesce(a.approv_begin_date, a.prov_begin_date) and
                            coalesce(a.approv_end_date, a.prov_end_date);
    

    您绝对应该学习明确的join 语法,因为它允许进行旧式语法所不允许的连接。此外,decode() 是特定于 Oracle 的(它已经被弃用了吗?)。 ANSI标准方法为CASE;但是,就您的目的而言,COALESCE() 是正确的功能且易于使用。

    请注意,sysdate 有一个时间组件。你很可能真的想要:

    trunc(sysdate) between coalesce(a.approv_begin_date, a.prov_begin_date) and
                                 coalesce(a.approv_end_date, a.prov_end_date);
    

    【讨论】:

      【解决方案2】:

      当您将联接更改为这样的内容时会发生什么?

      select nam,control_num
      from table_a a
      left join table_b b
        on b.emp_num = a.emp_num
      where sysdate between DECODE (approv_begin_date
      ,                NULL, a.prov_begin_date
      ,                a.approv_begin_date)and DECODE (approv_end_date
      ,                NULL, a.prov_end_date
      ,                a.approv_end_date)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多