2010-10-25 110 views
1

普通SQL查询与MS Access 2007查询不同吗?MS Access 2007疑难问题SQL查询

我有这个简单的查询,但它不工作在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工作(如果我使用别名,直接做到这一点 - 这是毫秒的存取SQL设计的输出中)

我得到的加入操作语法错误。但MS Access没有指出哪个连接。

+1

你说的“不工作”是什么意思? – RedFilter 2010-10-25 16:11:40

+0

是,MS Access使用其不同的T-SQL语法不太表现从SQL Server稍微(在某些结构中) – 2010-10-25 16:13:10

+0

@RedFilter我得到“加入操作语法错误”,如果你通过子字符串搜索没有“不工作”在我的文章@米奇小麦你会介意翻译这到TSQL – 2010-10-25 16:16:34

回答

1

是从MS Access 2007年不同寻常的查询SQL查询?

通过“普通的SQL”你大概的意思是入门级的SQL-92标准SQL(不管你知不知道!)

整体而言,接入(ACE,喷气机,等等)不符合SQL-92。

具体而言,Access的JOIN语法不符合SQL-92。

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

在Access中,每个JOIN子句必须自己括在圆括号内,但所有JOIN子句的优先级相同。

换句话说,访问扼流圈标准语法和自己的语法比标准的:(

+0

感谢您提供非常详细的答案 – 2010-10-26 17:27:46

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; 

这仍然可能会返回一个错误,由于具有相同名称不同的列 - 如果是这样,就应该更换.*以上只是从每个表中所需的列,用适当的列别名。

+0

你是对的,我直接从MS Access编辑。在发布问题之前,我已经尝试了您的回答,但是我收到了一个奇怪的错误。语法错误(缺少操作符)'StudentSubject.SubjectID = Subject.SubjectID INNER JOIN教授ON Subject.ProfessorID = Professor.ProfessorID INNER JOIN Student ON StudentSubject.StudentID = Student.StudentID LEFT JOIN Church ON Student.ChurchID = Church.Church ' – 2010-10-25 16:24:10

+0

@geocine,您是否尝试用每个表中只包含必需列的'。*'替换适当的列别名?有时返回的错误信息可能有点误导。 – 2010-10-25 16:31:06

+0

是的,谢谢。但是,我找到了答案。 – 2010-10-25 16:40:16

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); 
+0

这与您在问题中发布的查询不同。它可能很好地返回相同的数据,但是它的所有嵌套派生表子查询都比原来的要复杂得多。 – 2010-10-27 21:37:00