===问题===SQL LEFT JOIN奇怪的语法错误?
我在3个表上使用了LEFT JOIN,SQL表达式。当我尝试运行MS ACCESS 2007时,出现意外错误“JOIN表达式不受支持”。
===细节===
这些表都连接
- 父:是在最高水平
- child1:父母的孩子
- 的child2:父 的孩子
- 孙子1:小孩1
这是SQL表达式导致错误:
SELECT *
FROM ((grandchild1 AS gc
LEFT JOIN child1 AS c1 ON gc.child1_id=c1.id)
LEFT JOIN parent AS p ON c1.parent_id=p.id)
LEFT JOIN child2 AS c2 ON (p.id=c2.parent_id
AND c2.start<=gc.time AND gc.time<=c2.stop)
奇怪的是,下面的表达式中,我只在更换了布尔表达式的一个与真“ON”条款并得到接受:
SELECT *
FROM ((grandchild1 AS gc
LEFT JOIN child1 AS c1 ON gc.child1_id=c1.id)
LEFT JOIN parent AS p ON c1.parent_id=p.id)
LEFT JOIN child2 AS c2 ON (TRUE
AND c2.start<=gc.time AND gc.time<=c2.stop)
===问题===
- 是有什么毛病 语法我的表达?
- 我注意到的另一件事是我不能在ON子句中使用EXISTS子句 ,这是正常的吗?
===解决方案===(感谢大卫-W-芬顿)
SELECT *
FROM ((grandchild1 AS gc
INNER JOIN child1 AS c1 ON gc.child1_id=c1.id)
INNER JOIN parent AS p ON c1.parent_id=p.id)
INNER JOIN child2 AS c2 ON (p.id=c2.parent_id)
AND (c2.start<=gc.time) AND (gc.time<=c2.stop)
谢谢大卫。正如你所说的,使用QBE让访问构建连接就能提供解决方案。我试着用左连接替换它使用的INNER JOIN,但是导致错误返回。它也似乎不喜欢我把括号之间的ON子句(我认为我实际上在帮助它),但它似乎没有在ON子句中的表的顺序问题。我想它使用INNER JOINs更有意义,所以我会坚持。我很高兴它解决了。它真的让我疯狂 – symbiont 2010-10-07 04:11:41
利用QBE。它确实可以让你的生活更容易获得Jet/ACE的正确语法。 – 2010-10-08 01:52:51