1
select t2.s_studentreference
        , t1.p_surname
        , t1.p_forenames
        , t3.e_reference
        , t3.e_name
    from capd_a t1
    right outer join capd_b t2
      on (t2.s_id = t1.p_id)
    join capd_c t3 
      on ((t3.e_student=t1.p_id) and (t3.e_reference='D /YR2A2/12'))

我收到此错误:

Syntax Error (Missing Operator) on (t2.s_id = t1.p_id)
        join capd_c t3 
          on ((t3.e_student=t1.p_id) and (t3.e_reference='D /YR2A2/12')) 

知道我的查询有什么问题吗?

4

3 回答 3

2

Access 有一个变态版本的 SQL,而不是 ISO/ANSI 标准。当连接两个以上的表时,它真的很喜欢(阅读:需要)括号。对于括号内允许的连接类型(LEFT、RIGHT、INNER)也有限制:

from 
   (                           --- required
     capd_a t1 
INNER join capd_b t2           --- RIGHT join turned into INNER
  on (t2.s_id = t1.p_id)
   )                           --- required
INNER join capd_c t3 
  on ((t3.e_student=t1.p_id) and (t3.e_reference='D /YR2A2/12'))
于 2012-09-24T06:53:39.450 回答
1

尝试在 Access 查询设计器中构建您的查询。来自不同的数据库系统,您可能不太喜欢查询设计器,但我建议您尝试一下,因为它将帮助您创建 Access 数据库引擎可以接受的 SQL。

您面临的差异包括:

  1. 当您的查询包含超过 2 个数据源并且对它们的位置要求很高时,Access 需要括号。
  2. db 引擎不将 JOIN 识别为INNER JOIN. 您必须始终指定连接类型 ( INNER; LEFT; 或RIGHT)。
  3. 引擎会接受RIGHT OUTER JOIN,但查询设计器会将其更改为 just RIGHT JOIN。所以它并没有真正的区别,但我提到它只是为了避免混淆。

如果您不能容忍查询设计器,我将提供此作为起点。

select t2.s_studentreference
        , t1.p_surname
        , t1.p_forenames
        , t3.e_reference
        , t3.e_name
    from (capd_a t1
    inner join capd_b t2
      on t2.s_id = t1.p_id)
    inner join capd_c t3 
      on t3.e_student=t1.p_id
where t3.e_reference='D /YR2A2/12'

我两次都使用内部联接,因为在某些情况下,Access 会在同一个查询中加入LEFTRIGHT加入并加入。INNER我不确定RIGHT在这种情况下您的加入是否会成为问题,但两者INNER都肯定会起作用。因此,首先让所有其余的查询语法正常工作,然后根据需要修改您的连接类型。

t3.e_reference='D /YR2A2/12'ONtoWHERE子句移到了。这是我的偏好,但我认为这两种方式都不会产生影响。

于 2012-09-24T08:13:16.273 回答
0

由于您的查询包含t3.e_reference='D /YR22/A12'ON语句范围内,应将其排除在ON语句范围之外,并将其单独写入ON语句范围之外......

你可以这样做;

select t2.s_studentreference
        , t1.p_surname
        , t1.p_forenames
        , t3.e_reference
        , t3.e_name
    from capd_a t1
    right outer join capd_b t2
      on (t2.s_id = t1.p_id)
    join capd_c t3 
      on (t3.e_student=t1.p_id)
 and (t3.e_reference='D /YR2A2/12')

或者,您可以WHERE在查询中使用 use 子句:

 SELECT t2.s_studentreference
            , t1.p_surname
            , t1.p_forenames
            , t3.e_reference
            , t3.e_name
        FROM capd_a t1
        RIGHT OUTER JOIN capd_b t2
          ON (t2.s_id = t1.p_id)
        JOIN capd_c t3 
          ON (t3.e_student = t1.p_id)
     WHERE t3.e_reference='D /YR2A2/12'
于 2012-09-24T06:42:12.227 回答