2012-01-07 84 views
1

我想在MS Access中创建一个查询,最多可以查询4个表以产生一个很好的信息整理。
在点击查看我收到一个错误:Microsoft Access 2007 - 查询多个表会产生错误

Syntax error (missing operator) in query expression sessions.sessionTypeFK=session_type.session_type.id) inner join staff on (sessions.StaffFK=staff.staff_id) inner join person on (staff.FK_personID=person.personID'

有趣的是它总是错过了最后支架的错误?

SELECT sessions.*, session_type.[Session Type],forename,surname 
from sessions 
inner join session_type on (sessions.SessionTypeFK=session_type.session_type_id) 
inner join staff on (sessions.StaffFK=staff.Staff_ID) 
inner join person on (staff.FK_PersonID=person.PersonID) 

我知道,MS Access是模糊的,你必须包装与()内连接才能正常工作,我与其他几个疑问做到了这一点,但我真的努力得到该位解析。

回答

0

你的意思是:

SELECT sessions.*, session_type.[Session Type],forename,surname 
from ((sessions 
inner join session_type on sessions.SessionTypeFK=session_type.session_type_id) 
inner join staff on sessions.StaffFK=staff.Staff_ID) 
inner join person on staff.FK_PersonID=person.PersonID 

为什么不使用Access查询设计窗口,然后切换到SQL视图来获取样本SQL?

+0

非常感谢。如果微软坚持标准而不是发明自己的标准,那将会变得更加容易。 – Trabumpaline 2012-01-08 17:24:22

0

由于他们都是内部连接,你可以重新写在一个更简单的格式的查询,而无需使用查询设计器看起来像这样:

SELECT S.*, T.[Session Type], P.Forename, P.Surname 
FROM Sessions As S, Session_Type As T, Staff As F, Person As P 
WHERE T.Session_Type_ID = S.SessionTypeFK 
AND F.Staff_ID = S.StaffFK 
AND P.PersonID = F.FK_PersonID 

只要你不与外连接工作那么你可以在WHERE子句中链接你的表,所以很容易回读。您也可能会注意到我已经使用Aliases作为表名,这也有助于使SQL更容易遵循,并且如果您正在编写大型SQL或具有长表名,则可以显着缩小代码。

+0

我不确定隐式连接是否是一个好主意,请考虑“......具有交叉连接的不必要的可能性:您可以在没有相应WHERE子句的情况下将表添加到FROM部分,这被认为是有害的。 - http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins – Fionnuala 2012-01-08 13:15:01

+0

@Remou公平点,虽然用这种方式编写SQL将有希望鼓励人们成为SQL能干的人(除了查询设计者因为在某些情况下可能效率不高),并了解不使用的做法。 – 2012-01-08 15:52:28