使用多个“和”连接多个表

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 数据库中尝试过它并且它可以工作,它也应该适合你。

以上是关于使用多个“和”连接多个表的主要内容,如果未能解决你的问题,请参考以下文章

使用条件连接多个表

如何在连接多个表时使用 GROUP BY 连接字符串?

使用 OR 和标签连接多个列上的两个表

使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表

使用表函数优化多个连接

lambda 表达式使用 select 和 where 子句连接多个表