Access多表关联查询求助:如何避免歧义外连接?
别慌,咱们先把这些表的关联关系理清楚,再一步步写查询就简单多了!
先理清表之间的关联逻辑
这是写对查询的核心前提,先把各个表的绑定关系捋明白:
tblEmployee(员工表) ↔tblInstructorDeliverables(讲师交付表):通过EmpID关联——说白了就是“讲师本身就是员工”,用员工ID绑定两者tblCourseCatelog(课程目录表) ↔tblInstructorDeliverables:通过CatelogID关联——表示这个讲师负责该目录下的课程tblCourseCatelog↔tblSessions(课程场次表):通过CatelogID关联——每个场次都属于某个课程目录下的课程tblInstructorDeliverables↔tblInstructorSessions(讲师场次表):通过Instructor字段(外键指向tblInstructorDeliverables.ID)关联——记录这个讲师实际负责的具体场次
基础查询示例:获取讲师、课程、场次核心信息
假设你需要查询讲师姓名、负责的课程名称、对应的场次时间,可以直接用下面的Access SQL语句:
SELECT e.Name AS 讲师姓名, cc.CourseName AS 课程名称, s.DateAndTime AS 场次时间 FROM tblEmployee e INNER JOIN tblInstructorDeliverables idel ON e.EmpID = idel.EmpID INNER JOIN tblCourseCatelog cc ON idel.CatelogID = cc.CatelogID INNER JOIN tblSessions s ON cc.CatelogID = s.CatelogID INNER JOIN tblInstructorSessions isess ON idel.ID = isess.Instructor
小细节说明:
- 用
INNER JOIN是为了只获取所有关联都存在的数据(比如只显示有对应场次的讲师和课程);如果要包含“还没排场次的讲师/课程”,把对应的INNER JOIN换成LEFT JOIN就行 - 表名后面加的别名(比如
tblEmployee e)是为了让SQL更简洁,不用反复写长表名 AS用来给字段起友好的别名,方便你看查询结果
按需调整查询内容
如果你的需求更具体,比如:
- 只想看某个讲师的信息:在语句末尾加
WHERE e.EmpID = '你的目标EmpID' - 筛选某个时间段的场次:加
WHERE s.DateAndTime BETWEEN #2024-01-01# AND #2024-12-31#(注意Access里日期要用#包裹) - 要显示更多字段:直接在
SELECT里加就行,比如idel.ID AS 交付记录ID、s.SessionID AS 场次ID
调试小技巧
如果写出来的查询没结果或者不对,可以分步测试:
- 先只关联两个表(比如
tblEmployee和tblInstructorDeliverables),确认能查到讲师和对应的课程目录ID - 再逐步加入剩下的表,每加一个就运行一次,看结果是否符合预期,这样能快速定位哪里出了问题
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

