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 上运行