我目前正在运行此代码:
select distinct day
from v_nem_rm16, dbp_holiday
where v_nem_rm16.day != dbp_holiday.holiday_date;
为什么我仍然会在v_nem_rm16.day
等于dbp_holidays.holiday_day
的情况下获得结果?我想过滤掉v_nem_rm16.day
中日期等于dbp_holidays.holiday_day
中日期的所有行。
答案 0 :(得分:1)
检索所请求数据的查询已由其他帖子提供。 但你也问过:
为什么我仍然得到v_nem_rm16.day等于dbp_holidays.holiday_day的结果?
假设您的dbp_holidays
表包含至少两个不同的日期:
table: dbp_holidays
holiday_day
----------
2015-05-01
2015-07-31
2015-12-25
表v_nem_rm16
包含的日期可能与dbp_holidays
的日期重合,也可能不重合,例如
table: v_nem_rm16
day
----------
2015-02-17
2015-12-25
交叉连接
select
v_nem_rm16.day
dbp_holidays.holiday_day
from
v_nem_rm16,
dbp_holidays
检索以下元组
day holiday_day
---------- ----------
2015-02-17 2015-05-01
2015-02-17 2015-07-31
2015-02-17 2015-12-25
2015-12-25 2015-05-01
2015-12-25 2015-07-31
2015-12-25 2015-12-25
所以v_nem_rm16
表中的每一行都出现n次,其中n是dbp_holidays
的行数。
添加where子句最多可以删除每个v_nem_rm16.day
值中的一个,并且每个v_nem_rm16.day
个日期至少有n-1行。
所以
select
v_nem_rm16.day
dbp_holidays.holiday_day
from
v_nem_rm16,
dbp_holidays
where
v_nem_rm16.day != dbp_holidays.holiday_day
检索
day holiday_day
---------- ----------
2015-02-17 2015-05-01
2015-02-17 2015-07-31
2015-02-17 2015-12-25
2015-12-25 2015-05-01
2015-12-25 2015-07-31
将选择列表缩小为
select
v_nem_rm16.day
from
v_nem_rm16,
dbp_holidays
where
v_nem_rm16.day != dbp_holidays.holiday_day
给出
day
----------
2015-02-17
2015-02-17
2015-02-17
2015-12-25
2015-12-25
应用不同运算符
之后select
distinct v_nem_rm16.day
from
v_nem_rm16,
dbp_holidays
where
v_nem_rm16.day != dbp_holidays.holiday_day
我们得到了
day
----------
2015-02-17
2015-12-25
选择返回v_nem_rm16
表的所有天。
答案 1 :(得分:0)
为什么不使用not exists
?
select r.day
from v_nem_rm16 r
where not exists (select 1
from dbp_holiday h
where r.day = h.holiday_date
);
您可以使用JOIN
,特别是LEFT JOIN
:
select r.day
from v_nem_rm16 r left join
dbp_holiday h
on r.day = h.holiday_date
where h.holiday_date is null;
这只是强调了为什么你不应该在from
子句中使用逗号并始终使用显式join
语法。