我这里有场景,有2个表,分别是A和B。
一个表具有emp_id
和date
,而B表具有2个日期ppl_d
,expr_d
和emp_id
左手何时像蜂巢一样加入
select A.emp_id
from A
LEFT JOIN B
ON a.emp_id=b.emp_id
where A.date between B.appl_d and B.expr_d
我看到表A中有一个雇员,而表B中没有,并且当我LEFT JOIN
到来时,emp_id
就必须来了,但因为在{{ {} {1}}和expr id ...
如何处理NULL,以便将特定的NULL
放入我的结果中。我也尝试了合并功能,但是没有运气...尝试输入默认值但仍然没有运气...
让我知道任何细节。提前谢谢...,这些日期都是字符串格式。
答案 0 :(得分:1)
在between
条件不允许空值添加左连接被转换到内部。加OR b.emp_id is NULL
(加入键)这将允许没有加入记录,无需添加相同条件中使用的所有列between
。
select *
from A
LEFT JOIN B ON a.emp_id=b.emp_id
LEFT JOIN C on a.emp_id=c.emp_id
where ((A.date between B.appl_d and B.expr_d) OR b.emp_id is NULL)
and
((a.date between c.del_d and c.fin_d) OR c.emp_id is NULL)
这是一个测试:
with
A as
(
select stack(3,100,'2019-01-13',
200,'2019-01-13',
300,'2019-01-13'
) as (emp_id, date)
),
B as (
select stack(1,100,'2019-12-30','3000-01-01') as (emp_id, appl_d, expr_d)
),
C as
(
select stack(1,100,'2015-06-07', '9999-12-31') as (emp_id, del_d, fin_d)
)
select A.*
from A
LEFT JOIN B ON a.emp_id=b.emp_id
LEFT JOIN C on a.emp_id=c.emp_id
where ((A.date between B.appl_d and B.expr_d) OR b.appl_d is NULL)
and
((a.date between c.del_d and c.fin_d) OR c.emp_id is NULL)
结果:
OK
200 2019-01-13
300 2019-01-13
Time taken: 84.475 seconds, Fetched: 2 row(s)
显然,这种方法行不通。 EMP_ID = 100应在返回的数据集。
这个问题很有趣,我稍后会继续进行调查。你们可以使用我的测试来找到有效的解决方案。