使用多个“和”连接多个表
Posted
技术标签:
【中文标题】使用多个“和”连接多个表【英文标题】:join multiple tables with multiple 'and' 【发布时间】:2014-06-06 17:15:53 【问题描述】:我有 3 张桌子要合并。一个是 Personnel 列表,一个是 Personnel 表中每个人的 Schedules 列表,第三个是每个人的临时计划列表。我想返回一个表格,其中包含来自人员的一些信息,然后是他们的日程安排和临时日程安排,其中两种类型的日程安排开始和结束日期符合某些标准。我尝试了以下 SQL 代码...
SELECT Personnel.ID, Personnel.Name, Schedules.LinkID, Schedules.BeginDate, Schedules.EndDate, Schedules.Shift, tempSchedules.LinkID, tempSchedules.BeginDate, tempSchedules.EndDate, tempSchedules.Shift
FROM ((Personnel INNER JOIN Schedules ON (Schedules.LinkID = Personnel.ID
AND ((Schedules.BeginDate BETWEEN #01-June-2014# and #30-June-2014#) OR (Schedules.EndDate BETWEEN #01-June-2014# and #30-June-2014#) OR (Schedules.BeginDate <=#01-June-2014# AND Schedules.EndDate >=#30-June-2014#))))
INNER JOIN tempSchedules ON (tempSchedules.LinkID = Personnel.ID
AND ((TempSchedules.BeginDate BETWEEN #01-June-2014# and #30-June-2014#) OR (TempSchedules.EndDate BETWEEN #01-June-2014# and #30-June-2014#) OR (TempSchedules.BeginDate <=#01-June-2014# AND TempSchedules.EndDate >=#30-June-2014#))))
ORDER BY Schedules.Shift
这有效,但它返回的结果只有 TempSchedules 和 Schedules 开始和结束日期都符合条件,并在 Schedules 列旁边加入 TempSchedules 列。例如,我得到以下列...
ID | Name | Schedules.LinkID | Schedules.BeginDate | Schedules.EndDate | Schedules.Shift | TempSchedules.LinkID | TempSchedules.BeginDate | TempSchedules.EndDate | TempSchedules.Shift
我希望它看起来像这样......
ID | Name | LinkID | BeginDate | EndDate | Shift
所以我会从 Schedule 中获取符合日期条件的列,然后从 TempSchedules 中获取符合日期条件的列。
ID | Name | LinkID | BeginDate | EndDate | Shift
01 | Bob | 52 | 01-April-2014 | 01-Dec-2014 | Days
02 | Tim | 34 | 01-Jan-2014 | 01-Aug-2014 | Days
03 | Bob | 52 | 01-Jun-2014 | 15-Jun-2014 | Swings //this is from temp schedules)
04 | Tim | 34 | 07-Jun-2014 | 28-Jun-2014 | Graves //this is from temp schedules)
我正在使用 javascript 访问 Microsoft Access 数据库。
【问题讨论】:
【参考方案1】:考虑使用 UNION ALL:像这样:
SELECT ID, Name, LinkID, BeginDate, EndDate, Shift
FROM (
SELECT Personnel.ID, Personnel.Name, Schedules.LinkID, Schedules.BeginDate, Schedules.EndDate, Schedules.Shift
FROM Personnel INNER JOIN Schedules ON (Schedules.LinkID = Personnel.ID
AND ((Schedules.BeginDate BETWEEN #01-June-2014# and #30-June-2014#) OR (Schedules.EndDate BETWEEN #01-June-2014# and #30-June-2014#) OR (Schedules.BeginDate <=#01-June-2014# AND Schedules.EndDate >=#30-June-2014#)))
union all
SELECT Personnel.ID, Personnel.Name,tempSchedules.LinkID, tempSchedules.BeginDate, tempSchedules.EndDate, tempSchedules.Shift
FROM Personnel INNER JOIN tempSchedules ON (tempSchedules.LinkID = Personnel.ID
AND ((tempSchedules.BeginDate BETWEEN #01-June-2014# and #30-June-2014#) OR (tempSchedules.EndDate BETWEEN #01-June-2014# and #30-June-2014#) OR (tempSchedules.BeginDate <=#01-June-2014# AND tempSchedules.EndDate >=#30-June-2014#)))
)
ORDER BY Shift
【讨论】:
我已经在 MS Access 中直接尝试了这个 SQL 语句,但我得到了“FROM 子句中的语法错误”错误。我已经玩过括号了,但仍然出现错误。通常 Access 会突出显示语句中出现问题的位置,但在这种情况下,它只是将光标放在语句的末尾。 我刚刚更新了它:立即尝试:我已经在 Access 数据库中尝试过它并且它可以工作,它也应该适合你。以上是关于使用多个“和”连接多个表的主要内容,如果未能解决你的问题,请参考以下文章