SQL - 选择某个日期不存在的用户

Posted

技术标签:

【中文标题】SQL - 选择某个日期不存在的用户【英文标题】:SQL - Select users that are not present on a certain date 【发布时间】:2019-07-11 10:58:02 【问题描述】:

我有两张桌子,一张供用户使用,另一张供他们出勤。我需要显示某个日期不在考勤表上的用户。

这是我的桌子:

USER_TABLE

| ID   | Name     |
-------------------
| 1    | John     |
| 2    | Peter    |
| 3    | Anne     |
| 4    | May      |
ATTENDANCE_TABLE

| ID   | Date       |
--------------------------------
| 2    | 2019-02-16 |
| 2    | 2019-02-17 |
| 2    | 2019-02-18 |
| 3    | 2019-02-17 |
| 4    | 2019-02-18 |

我需要选择“2019-02-18”上不存在的所有用户。

所以结果应该是这样的。

| ID   | Name     |
-------------------
| 1    | John     |
| 3    | Anne     |

谢谢。

【问题讨论】:

【参考方案1】:

试试这个查询,

select ID, Name
from USER_TABLE UT
where ID not in (select ID from ATTENDANCE_TABLE where date = '2019-02-18')

【讨论】:

【参考方案2】:
select ID, Name 
from USER_TABLE UT 
where ID not in (select ID from ATTENDANCE_TABLE where date = '2019-02-18')

【讨论】:

感谢,因为我有解决这些错误的想法【参考方案3】:
Drop table if exists my_users;

Create table my_users
(User_ID serial primary key
,Name varchar(100) not null unique
);

Insert into my_users values
(1,'John'),
(2,'Peter'),
(3,'Anne'),
(4,'May');

Drop table if exists my_ATTENDANCE;

Create table my_attendance
(user_ID INT NOT NULL
,Date date not null
,primary key(user_id,date)
);

Insert into my_attendance values
( 2    ,'2019-02-16'),
( 2    ,'2019-02-17'),
(2    ,'2019-02-18'),
(3    ,'2019-02-17'),
(4    ,'2019-02-18');

Select u.*
  From my_users u
  Left
  Join my_attendance a
    On a.user_id = u.user_id
   and a.date = '2019-02-18'
 Where a.user_id is null;

User_ID Name
      3 Anne
      1 John

https://rextester.com/YQZTM12580

【讨论】:

【参考方案4】:

您可以尝试使用左连接

SELECT a.id,name 
FROM USER_TABLE a
LEFT JOIN ATTENDANCE_TABLE b ON a.id=b.id
  AND b.date='2019-02-18'
AND b.id IS NULL

【讨论】:

你的意思是USER_TABLE .. LEFT JOIN ATTENDANCE_TABLE吗? @danblack,是的,实际上我的意思是——但写错了。感谢您指出我的错误【参考方案5】:
Select UserTable.Id, name
From UserTable left join AttendanceTable
On UserTable.Id=AttendanceTable.Id
Where date! =#2019-02-18#

【讨论】:

这是不正确的,因为 a) 没有引用日期 # 不是引用,b) 它将返回 ID 2 两次。

以上是关于SQL - 选择某个日期不存在的用户的主要内容,如果未能解决你的问题,请参考以下文章

有关给定日期的sql查询,如果不存在,请提供最新日期

access sql语句查询某个日期字段是不是存在某个具体的日期(包含时分秒), sql怎么写

SQL如何选择表中不存在的记录?

oracle 12c 某个pdb不存在某个CDB级用户的解决办法

连接sql表以选择连接表中不存在的记录[重复]

存在于一年中但不存在于另一个中的日期的 SQL 语法