【问题标题】:Error on an ANSI SQL StatementANSI SQL 语句出错
【发布时间】:2012-09-24 06:37:50
【问题描述】:
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')) 

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

【问题讨论】:

  • 我刚刚发现您正在查询 Oracle 数据库,我建议移动到 ADO 记录集或 通过查询,然后,您可以在 Oracle SQL 中编写查询(对于带有 (+) 的外部连接肯定更好),并且还应该大大提高性能,因为查询将在服务器端运行。

标签: sql ms-access ansi-sql


【解决方案1】:

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'))

【讨论】:

  • 嗨,我已经尝试过了,但是我在 FROM 上收到了一个语法错误.....知道有什么问题吗?感谢您的帮助!
  • 如果您将capd_a t1 right outer join capd_b t2 替换为capd_b t2 left outer join capd_a t1 ?
  • 不,那也行不通。访问的另一个限制。但在这种情况下,RIGHT JOIN 等同于INNER JOIN。由于最后一个t3.e_student=t1.p_id 条件,RIGHT JOIN 是多余的,可以替换为INNER
【解决方案2】:

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

您面临的差异包括:

  1. 当您的查询包含超过 2 个数据源并且对它们的位置要求很高时,访问需要括号。
  2. db 引擎无法将 JOIN 识别为 INNER JOIN 的同义词。您必须始终指定连接类型(INNERLEFT;或RIGHT)。
  3. 引擎将接受RIGHT OUTER JOIN,但查询设计器会将其更改为仅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'ON 移动到 WHERE 子句。这是我的偏好,但我认为这两种方式都不会产生影响。

【讨论】:

    【解决方案3】:

    由于您的查询在ON 语句范围内包含t3.e_reference='D /YR22/A12',应将其排除在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 子句:

     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'
    

    【讨论】:

    • 这样,我仍然收到错误消息。任何的想法?非常感谢您的帮助!
    • 感谢 LolCoder 的更新,但不幸的是我仍然收到错误消息。我正在使用 Access 使用 ODBC 查询 oracle DB,可能是 ACCESS 上的语法有问题?非常感谢!
    猜你喜欢
    • 2017-11-26
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多