Sql 使用不存在的条件
我想通过查询从表days中选择未在表Chu inout中找到的日期,但我有此表days: 第二张表:Chu inout“ 我尝试了以下代码:Sql 使用不存在的条件,sql,sql-server,Sql,Sql Server,我想通过查询从表days中选择未在表Chu inout中找到的日期,但我有此表days: 第二张表:Chu inout“ 我尝试了以下代码: SELECT Date_1 from [dbo].[days] not EXISTS SELECT id_emp,Date_1 FROM ch_inout 预期的结果是: id_emp date_1 2 2019-08-02 2 2019-08-09 2 2019-08-10
SELECT Date_1 from [dbo].[days] not EXISTS SELECT id_emp,Date_1 FROM ch_inout
预期的结果是:
id_emp date_1
2 2019-08-02
2 2019-08-09
2 2019-08-10
6 2019-08-02
6 2019-08-04
6 2019-08-09
6 2019-08-10
您希望
不存在
和关联子句:
编辑:
您似乎希望所有的日子都不使用给定的id\u emp
:
SELECT d.Date_1
FROM [dbo].[days] d CROSS JOIN
(SELECT DISTINCT id_emp FROM ch_inout
) e
WHERE NOT EXISTS (SELECT 1
FROM ch_inout io
WHERE io.Date_1 = d.Date_1 AND io.id_emp = e.id_emp
);
您可以使用
交叉联接
生成所有组合,然后使用左联接
放弃现有组合,如所示:
select e.id_emp, d.date_1
from days d
cross join (select distinct id_emp from ch_inout) e
left join ch_inout c on c.id_emp = e.id_emp and c.date_1 = d.date_1
where c.id_emp is null
order by e.id_emp, d.date_1
结果:
id_emp date_1
------ ----------
2 2019-08-02
2 2019-08-09
2 2019-08-10
6 2019-08-02
6 2019-08-04
6 2019-08-09
6 2019-08-10
请参阅。您可以在此处使用
您可以尝试以下方法:
cte1(id_emp, date_1) as
(
select distinct(t1.id_emp), t2.date_1
from ch_inout t1
cross join days t2
)
select * from cte1
except
select * from ch_inout
你的代码出了什么问题?预期的结果:不是我想要的结果。我怎么能对相同的结果这样做呢?但结果与上面提到的“预期结果”不一样。你能找到解决方案吗?我们都在猜测你想要什么,因为你的帖子不太清楚。但结果与上面的不一样。”预期结果“正如我提到的,先生,您能找到任何解决方案吗?@programmer_25已修复。但结果与上述结果不同”预期结果“正如我提到的,sir结果也不正确,我希望id_emp和date_1列您编辑的上一个查询与结果不匹配,对,先生,希望我找到了解决方案希望您能找到解决方案先生,请节省我的时间
select e.id_emp, d.date_1
from days d
cross join (select distinct id_emp from ch_inout) e
left join ch_inout c on c.id_emp = e.id_emp and c.date_1 = d.date_1
where c.id_emp is null
order by e.id_emp, d.date_1
id_emp date_1
------ ----------
2 2019-08-02
2 2019-08-09
2 2019-08-10
6 2019-08-02
6 2019-08-04
6 2019-08-09
6 2019-08-10
SELECT Date_1 from [dbo].[days]
EXCEPT
SELECT Date_1 FROM ch_inout
cte1(id_emp, date_1) as
(
select distinct(t1.id_emp), t2.date_1
from ch_inout t1
cross join days t2
)
select * from cte1
except
select * from ch_inout