sql条件下解码中的外连接

Posted

技术标签:

【中文标题】sql条件下解码中的外连接【英文标题】:Outer join in decode in sql condition 【发布时间】: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

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

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于sql条件下解码中的外连接的主要内容,如果未能解决你的问题,请参考以下文章

LINQtoSQL 生成的 SQL 中的外连接过多

下)

下)

下)

深入理解关系中的外连接,左外连接,右外连接

关于与内连接结合使用时的外连接