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条件下解码中的外连接的主要内容,如果未能解决你的问题,请参考以下文章