MS Access 2007 中的 SQL JOIN 问题
Posted
技术标签:
【中文标题】MS Access 2007 中的 SQL JOIN 问题【英文标题】:SQL JOIN problem in MS Access 2007 【发布时间】:2010-10-22 14:24:27 【问题描述】:SELECT DISTINCT bw.Bor_name
FROM Borrower AS bw, Loan AS l
JOIN Book_Copy AS bc
ON l.Bc_id = bc.Bc_id
WHERE bw.Bor_id = l.Bor_id
GROUP BY l.Bor_id, bc.Bt_id
HAVING COUNT( bc.Bt_id ) > 1
AND COUNT( l.Bor_id ) > 1;
这在 mysql 测试环境中完美运行,但在我实际需要它运行的 MS Access 2007 中无法运行。我还有一些涉及使用 JOIN 的其他查询,它也为它们提供了相同的错误:“FROM 子句中的语法错误”。
编辑:
SELECT DISTINCT l.Bor_id
FROM Loan AS l
INNER JOIN Book_Copy AS bc
ON l.Bc_id = bc.Bc_id
GROUP BY l.Bor_id, bc.Bt_id
HAVING COUNT( bc.Bt_id ) > 1
AND COUNT( l.Bor_id ) > 1
实际上这个工作正常,并给了我所需的 id 号,但我想要输出的是 Borrower 表中包含的名称。
【问题讨论】:
您真的在使用 MySQL 为 MS Access 制作原型吗?只是好奇。 这不是你的问题的根源(没有 INNER/LEFT/RIGHT 的 JOIN 是问题),但是你为什么显式地做一个连接,l=>bc,一个隐式的, bw=>l?两者都是 INNER JOIN,因此使用 JOIN 进行这两种操作都应该有任何问题。虽然 Jet 通常以相同的方式优化等效的隐式和显式 JOIN,但我希望这是一个显式 JOIN——除非有充分的理由,否则我从不使用隐式 JOIN。 @Larry:MySQL 是我在家里的测试环境。不幸的是,我现在没有要测试的 Access 2007,我对实际帮助的回复将在星期一之前发布。 @David:非常感谢您的回复!我真的相信你有足够的能力,我非常感谢你的关心。是的,起初我尝试使用 LEFT/RIGHT 连接,但它会给我同样的错误。当我能够再次在 Access 中进行测试时,我会更多地使用它。 呃,谢谢?也就是说,为了确认我的能力? 【参考方案1】:我没有使用 Access 2007 进行测试。但是,如果我单独尝试 JOIN(没有明确使用 INNER JOIN),Access 2003 会抱怨“from 子句中的语法错误”。似乎数据库引擎要求您将 JOIN 指定为 RIGHT JOIN、LEFT JOIN 或 INNER JOIN;我找不到它会接受的任何其他变体。
更新:我建议您使用 Access 的查询设计器创建一个新查询。只需添加表并设置连接。 (将 GROUP BY 和其他所有内容留到以后。)然后您可以切换到 SQL 视图以查看使 Access 满意的连接语法类型。
【讨论】:
也非常感谢您的回复!是的,这就是我迄今为止所尝试的,但没有成功。【参考方案2】:我认为你不能混合使用隐式和显式连接。你应该试试这个
SELECT DISTINCT bw.Bor_name
FROM Borrower AS bw
join Loan AS l
on bw.Bor_id = l.Bor_id
JOIN Book_Copy AS bc
ON l.Bc_id = bc.Bc_id
GROUP BY l.Bor_id, bc.Bt_id
HAVING COUNT( bc.Bt_id ) > 1
AND COUNT( l.Bor_id ) > 1;
【讨论】:
您可以在 Jet/ACE/Access SQL 中混合使用隐式/显式 JOIN。问题是缺少 JOIN 类型,INNER/LEFT/RIGHT。 只是为了确认 - 它在 MySQL 中完美运行。我会在 Access 中再次测试,并告诉你结果如何。 只要使用正确的 JOIN 语法,在 Access 中混合隐式和显式 JOIN 也不应该有任何问题。 不幸的是,上面建议的代码在 MS Access 中也不起作用。它仍然给我同样烦人的错误。 Unsing INNER/LEFT/RIGHT 也无济于事。【参考方案3】:SELECT DISTINCT bw.Bor_name
FROM Borrower AS bw, Loan AS l
JOIN Book_Copy AS bc
ON (l.Bc_id = bc.Bc_id)
WHERE bw.Bor_id = l.Bor_id
GROUP BY bw.Bor_name, bc.Bt_id
HAVING COUNT( bc.Bt_id ) > 1
AND COUNT( l.Bor_id ) > 1;
最终这个人完成了这项工作。再次感谢所有提供建议的人!
【讨论】:
以上是关于MS Access 2007 中的 SQL JOIN 问题的主要内容,如果未能解决你的问题,请参考以下文章
尝试连接到 SQL 表时,MS Access 2007 中的查询错误
按计数排序未正确排序 - SQL (MS Access 2007)