MS Access 2007 SQL查询的问题

时间:2010-10-25 16:10:21

标签: sql mysql sql-server ms-access

普通的SQL查询是否与MS Access 2007查询不同?

我有这个简单的查询,但它在MS Access查询(SQL视图)中不起作用。这有什么问题?

SELECT StudentSubject.*, Subject.*,Professor.*, Student.*, Church.*
FROM 
(

SELECT StudentSubject.*, Subject.*,Professor.* , Student.*
FROM 
 (

 SELECT  StudentSubject.*, Subject.*,Professor.* 
FROM
 StudentSubject 
LEFT JOIN Subject ON StudentSubject.SubjectID=Subject.SubjectID
 INNER JOIN Professor ON Subject.ProfessorID=Professor.ProfessorID

  ) 
  INNER JOIN Student ON StudentSubject.StudentID=Student.StudentID
) 
LEFT JOIN Church ON Student.ChurchID=Church.ChurchID;

我相信如果我使用MySQL / MSSQL会有效(如果我使用别名并直接执行 - 这是ms访问sql设计器的输出)

我在连接操作时遇到语法错误。但是MS Access没有指出哪个加入。

3 个答案:

答案 0 :(得分:2)

略有不同,但我认为问题中的查询不会对其他数据库起作用 - 对子查询中的表名称的引用没有匹配的表名称。

试试这个,而不是:

SELECT StudentSubject.*, Subject.*,Professor.*, Student.*, Church.*
FROM  StudentSubject 
LEFT JOIN Subject ON StudentSubject.SubjectID=Subject.SubjectID
INNER JOIN Professor ON Subject.ProfessorID=Professor.ProfessorID
INNER JOIN Student ON StudentSubject.StudentID=Student.StudentID
LEFT JOIN Church ON Student.ChurchID=Church.ChurchID;

由于不同的列具有相同的名称,这可能仍然会返回错误 - 如果是这样,您应该仅使用每个表中所需的列替换上面的.*,并使用适当的列别名。

答案 1 :(得分:2)

添加括号可以解决问题

SELECT Subject.SubjectName,Professor.ProfessorName,Church.ChurchName,Student.StudentName 
FROM  ((((StudentSubject LEFT JOIN Subject 
ON StudentSubject.SubjectID=Subject.SubjectID)
INNER JOIN Professor ON Subject.ProfessorID=Professor.ProfessorID)
INNER JOIN Student ON StudentSubject.StudentID=Student.StudentID)
LEFT JOIN Church ON Student.ChurchID=Church.ChurchID);

答案 2 :(得分:1)

  

普通的SQL查询是否与MS Access 2007查询不同?

通过“普通SQL”,您可能意味着入门级SQL-92标准SQL(无论您是否知道!)

作为一个整体,Access(ACE,Jet,等等)不符合SQL-92。

具体来说,Access的JOIN语法不符合SQL-92。

在SQL-92中,一个或多个JOIN子句可以括在括号内以显示优先级;如果没有使用括号,则所有JOIN子句都具有相同的优先级。

在Access中,每个JOIN子句必须在括号内单独包含,但所有JOIN子句都具有相同的优先级。

换句话说,标准语法上的Access扼流圈及其自己的语法表达不如标准语言:(