2010-10-22 123 views
0
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子句中的语法错误”。MS Access 2007中的SQL JOIN问题

编辑:

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号,但我想输出是包含在借款人的表名。

+0

你真的使用MySQL为MS Access的原型吗?只是好奇。 – 2010-10-22 14:58:44

+0

这不是问题的根源(没有INNER/LEFT/RIGHT的JOIN是问题),但是为什么你明确地做了一个连接,l => bc,还有一个隐式地bw => l?两者都是INNER JOIN,因此在JOIN中应该有任何问题。虽然Jet通常优化相同的隐式和显式JOIN,但我希望这是一个明确的JOIN--除非有充分的理由这么做,否则我绝不使用隐式JOIN。 – 2010-10-23 01:05:09

+0

@Larry:MySQL是我在家里的测试环境。不幸的是,我现在没有使用Access 2007进行测试,并且我对实际帮助的回应将在周一之前发布。 – User3419 2010-10-23 17:33:47

回答

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

最终这个人做了这项工作。再次感谢所有提供建议的人!

0

我认为你不能混合隐式和显式连接。你应该有这个

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

您可以在Jet/ACE/Access SQL中混合使用隐式/显式JOIN。问题在于缺少JOIN类型,INNER/LEFT/RIGHT。 – 2010-10-23 01:05:57

+0

只是为了确认 - 它在MySQL中完美运行。我会在Access中再次测试,并让你知道结果是什么。 – User3419 2010-10-23 17:41:09

+0

只要使用正确的JOIN语法,在Access中不应该有任何混合隐式和显式JOIN的问题。 – 2010-10-24 02:35:39

4

尝试我没有Access 2007中考然而进入2003抱怨“FROM子句语法错误”如果我尝试单独加入(但并未明确使用INNER JOIN)。似乎数据库引擎要求您将JOIN指定为RIGHT JOIN,LEFT JOIN或INNER JOIN;我找不到任何其他可以接受的变化。

更新:我会建议你用Access的查询设计器创建一个新的查询。只需添加表格并设置连接即可。 (留下GROUP BY和其他所有内容以供后续使用。)然后,您可以切换到SQL View以查看使Access更加快乐的连接语法的类型。

+0

非常感谢这里的回复!是的,这就是我迄今为止所尝试的,但没有成功。 – User3419 2010-10-23 17:36:19