提问人:Zcast 提问时间:10/30/2023 最后编辑:Zcast 更新时间:11/1/2023 访问量:69
使用 MYSQL 和 VB 获取存在于一个表中但不存在于另一个表中的日期
Getting dates that exist in one table but not the other table using MYSQL and VB
问:
我知道论坛上有很多关于这个问题的答案,但我根本无法弄清楚我做错了什么。我尝试了很多方法,有些方法让我接近,但不是一路走来。
我有两张表:
“出勤”,包含三个字段“ID”、“DLNumber”、“Time”
带有 2 个字段“ID、时间”的“日历”
我正在尝试查找日历表中存在的日期,而出勤表中不存在这些日期。
我需要搜索两个日期之间的出勤率以及与驾照号码匹配的内容。然后将该查询的结果与日历中的日期进行比较。
我试过:
Dim sql As String = "SELECT calendar.Time FROM calendar WHERE
calendar.Time NOT IN (SELECT attendance.Time FROM attendance WHERE
attendance.DLNumber=?DL AND attendance.Time>= ?ST And
attendance.Time < ?ET)"
当我运行此查询时,我在 2023-10-23 和 2023-10-27 这两个日期之间进行搜索,结果是 都是四个日期,我需要“2023-10-24”作为结果。 没有运气。
我试过:
Dim sql As String = "Select calendar.Time,attendance.Time From calendar " _
& "Left Join attendance On attendance.time = calendar.Time WHERE
attendance.DLNumber=?DL AND attendance.Time>= ?ST And
attendance.Time < ?ET Order BY calendar.Time"
相同的结果。
我确定我没有正确解释这一点,所以请原谅我对 MYSQL 的无知,我是新手。
好的,这让我得到了在所选时间范围内的所有日期:
还行。。。因此,这让我在选定的时间范围内从一个表匹配到另一个表的所有日期:
Select calendar.Date,attendance.Date From calendar
Left Join attendance On attendance.Date = calendar.Date WHERE
attendance.DLNumber=?DL AND attendance.Date> ?ST And
attendance.Date <=?ET AND calendar.Date> ?ST And
calendar.Date <= ?ET Order BY calendar.Date
如何获取给定时间范围内不匹配的日期?
因此,几乎从两个表中获取从 10-23-23 到 10-30-23 的所有日期,并将它们进行比较以获取出勤表中缺少哪些日期,而日历表中缺少哪些日期......
答:
据我所知,您没有正确使用。而且您没有提供任何表结构或示例数据 - 您在其中显示您实际上有一个列。首先,您必须了解 a 基本上意味着“我希望左侧表中的所有内容有条件或无条件地返回结果,并根据特定列或条件返回右侧表中的任何匹配项”。只要你把表的条件严格地放在右边,就会发生这种情况。当您在 中定义引用右侧表的任何条件时,您正在从右侧的表中筛选出任何为真并取消功能的条件。LEFT JOIN
date
LEFT JOIN
ON
WHERE
LEFT JOIN
所以,你在这里做什么:
Select calendar.Date,attendance.Date From calendar
Left Join attendance On attendance.Date = calendar.Date
WHERE [[ attendance.DLNumber=?DL
AND attendance.Date> ?ST
And attendance.Date <=?ET ]] <--- these cancel the left join function
AND calendar.Date> ?ST And calendar.Date <= ?ET Order BY calendar.Date
你应该做的是:
SELECT calendar.Date,attendance.Date
/* table on the left */ /* table on the right */
FROM calendar LEFT JOIN attendance
ON attendance.Date = calendar.Date
/* continue these conditions in ON */
AND attendance.DLNumber=?DL
AND attendance.Date> ?ST
AND attendance.Date <=?ET
/* WHERE filter here should only be for calendar table if you want to maintain the left join function */
WHERE calendar.Date> ?ST AND calendar.Date <= ?ET ORDER BY calendar.Date
您应该看到结果与此有所不同。
下面是一个小提琴示例:https://dbfiddle.uk/K4ynr2ai
评论
LEFT JOIN
WHERE
WHERE
AND
ON
On attendance.time = calendar.Time WHERE attendance.DLNumber=?DL ...
On attendance.time = calendar.Time AND attendance.DLNumber=?DL ...
Time
SHOW CREATE TABLE table_name;