sql从两个select语句中删除common

时间:2018-08-03 08:51:07

标签: sql select compare

我正在尝试执行SQL Select查询,在这里我可以看到今天所有在工作的员工。

第一个查询选择所有员工:

SELECT      Medarbejdere.navn AS Medarbejder
FROM        Medarbejdere

另一个选择显示不在工作的员工。

SELECT      Medarbejdere.navn AS Medarbejder
FROM        Medarbejdere, Fravaer
WHERE       Medarbejdere.id = Fravaer.medarbejder
AND         Fravaer.slut IS NULL

我如何结合这两个选择语句,以便将今天不在工作中的雇员从雇员的完整列表(第一个选择语句)中删除?

我尝试了UNION和JOINS。

有什么建议吗?

编辑-> 这确实有效,但是我想使其与JOIN一起使用

SELECT      Medarbejdere.navn AS Medarbejder
FROM        Medarbejdere
EXCEPT
SELECT      Medarbejdere.navn AS Medarbejder
FROM        Medarbejdere, Fravaer
WHERE       Medarbejdere.id = Fravaer.medarbejder
AND         Fravaer.slut IS NULL 

没有结束日期的我(缺席)(我正在尝试过滤掉的那些人)

INSERT INTO Fravaer VALUES (3, '2018-08-01', null, 4);

或没有结束日期(我要包括的人)

INSERT INTO Fravaer VALUES (6, '2018-08-01', '2018-09-01', 5);

2 个答案:

答案 0 :(得分:1)

您可以使用LEFT连接:

SELECT *
FROM    Medarbejdere m
    LEFT JOIN Fravaer f
        ON f.medarbejder = m.ID
WHERE f.ID IS NULL;

答案 1 :(得分:1)

我不确定列名定义了什么,只是给您一些想法。查找不在无效列表中的员工。

您还可以使用Left join并查看哪个连接更快。

-- dummy query based on your inputs

SELECT      Medarbejdere.navn AS Medarbejder
FROM        Medarbejdere
where Medarbejdere.id not in (
SELECT      Medarbejdere.id
FROM        Medarbejdere, Fravaer
WHERE       Medarbejdere.id = Fravaer.medarbejder
AND         Fravaer.slut IS NULL )

-- second option, based on sample data
SELECT *
FROM    Medarbejdere m
LEFT JOIN Fravaer f
    ON f.medarbejder = m.ID
WHERE f.slut IS NOT NULL and f.slut>= '2018-09-01'; //you can use generic 
currentdate option