【问题标题】:Select From One Table where Does not exist in another从另一个表中不存在的表中选择
【发布时间】:2014-01-12 10:23:27
【问题描述】:

我有一张桌子和人,如果这些人“缺席”,我还有第二张桌子要记录 缺席表(Absences)有 AbsenceID、PersonID 和 AbsentDate People 表有 PersonID、FirstName、LastName

我正在尝试创建一个 SQL 来获取 People 表中的所有值,但当天缺席的值除外。因此,如果例如 Joe 在 Absences 表中列出并且 AbsentDate 是 2014 年 11 月 1 日,我希望他的名字从生成的查询中排除。这是我到目前为止所拥有的,但它什么也没显示:

我在下面尝试过,但它返回了所有行:

SELECT * FROM People 
where not exists(Select PersonID 
                 from Absences 
                 where Absences.AbsentDate = 11/01/2014)

我确信这是我所缺少的非常简单的东西。任何帮助将不胜感激

【问题讨论】:

  • 您使用的是什么 DBMS?
  • 我正在使用 Microsoft Access
  • AbsentDate 列的数据类型是什么??
  • AbsentDate 的数据类型是日期/时间

标签: sql ms-access


【解决方案1】:
SELECT * FROM People 
where PersonID NOT IN (Select PersonID 
                       from Absences 
                       where DateValue(Absences.AbsentDate) = '20140111')
                                                                  ^ YYYYMMDD

【讨论】:

  • 当我测试它时,这仍然会返回 People 表中的所有行
  • @SSS 您是否要返回在该特定日期缺席的人员姓名???或者谁没有缺席??
  • Nono,我试图从 People 表中获取所有值,除非它们在该日期的 Absences 表中列为缺席。所以如果乔,例如,2014 年 11 月 1 日缺席(这在缺席表中),他不应该出现在返回的结果中
  • 在这种情况下,这个查询应该可以工作。试着自己执行内部查询,看看你能不能找回 Joe 的 ID ???
  • 啊,你是对的。它什么也没返回。我必须将日期设置为 #1/11/2014# 然后它起作用 SELECT * FROM People WHERE PersonID Not In (Select Absences.PersonID from Absences where (Absences.AbsentDate) = #1/11/2014# )
【解决方案2】:

由于AbsentDate 是一个日期/时间字段,它同时存储日期和时间,您正在寻找两者的相等性。所以 '11/01/2014' 等同于搜索 '11/01/2014 00:00:00.000',我几乎可以打赌没有存储任何内容。因此,更好的方法是在“11/01/2014 00:00:00.0000”和“11/01/2014 23:59:59.999”之间寻找您的值,这就是@ 987654322@ 运营商可以。

SELECT *
FROM People
LEFT JOIN Absences ON (People.PersonID = Absences.PersonID) AND (Absences.AbsentDate BETWEEN '11/01/2014' AND '12/01/2014')
WHERE AbsenceID IS NULL

我不喜欢NOT IN 查询,因为它们一般都可能表现不佳。但是一个 LEFT JOIN 连接表的主键是 NULL 工作得很好(假设适当的索引等)

【讨论】:

  • 根据与性能相关的 cmets,我更喜欢这种方法而不是 NOT IN。还有NOT EXISTS方法也比NOT IN好。
【解决方案3】:

首先您应该提及您使用的是哪个数据库,这里的当前信息是建议的答案 您应该按如下方式编写查询

SELECT * FROM People where PersonID NOT in (Select PersonID 
                   from Absences 
                   where Absences.AbsentDate = sysdate)

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 2016-01-05
    • 2018-01-23
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多