MS Access 2007 SQL 查询出现问题

Posted

技术标签:

【中文标题】MS Access 2007 SQL 查询出现问题【英文标题】:Trouble with MS Access 2007 SQL Query 【发布时间】:2010-10-25 16:10:21 【问题描述】:

普通的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 access sql 设计器的输出)

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

【问题讨论】:

“不工作”是什么意思? 是的,MS Access 使用的 TSQL 语法与 SQL Server 略有不同(在某些结构中) @RedFilter 我得到“连接操作的语法错误”,如果你按子字符串搜索,我的帖子上没有“不工作”@Mitch Wheat 你介意把它翻译成 TSQL @geocine:看来您的子字符串匹配算法也“不起作用”……你这个厚脸皮的猴子。 在我看来,您需要为派生表子选择设置别名。我看不出你怎么可能引用*** SELECT 中不在*** FROM 中的表。这是非常非常丑陋的 SQL,我不明白你为什么认为你需要那样做。也就是说,我只是在派生表中看不到任何意义。在我看来,您只不过是在派生表中加入表而已,我不明白为什么您不能一次性完成所有这些操作。 【参考方案1】:

略有不同,但我认为问题中的查询也不适用于其他数据库 - 子查询中的表名引用未与匹配的表名别名。

试试这个吧:

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;

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

【讨论】:

你说得对,我直接从 MS Access 编辑了这个。在发布问题之前,我已经尝试过您的回答,但是出现了一个奇怪的错误。语法错误(缺少运算符)'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.Church'跨度> @geocine,您是否尝试将.* 替换为每个表中所需的列,并使用适当的列别名?有时返回的错误消息可能有点误导。【参考方案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);

【讨论】:

这与您在问题中发布的查询不同。它很可能会返回相同的数据,但它比原始数据要复杂得多,包含所有嵌套的派生表子查询。【参考方案3】:

普通的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 扼杀了标准语法及其自身的语法,其表现力不如标准的 :(

【讨论】:

感谢您非常详细的回答

以上是关于MS Access 2007 SQL 查询出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 2007 中对 ODBC 表导入 sql 查询

尝试连接到 SQL 表时,MS Access 2007 中的查询错误

MS Access 2007 查询不在 SQL Server 2008 上运行

插入查询中发生语法错误(MS Access)

如何通过 Java 从 MS Access 2007 数据库中读取 Unicode 字符?

如何在 MS ACCESS 2007 查询中使用 LIMIT