【问题标题】:SQL / ORACLE Missing keywordSQL / ORACLE 缺少关键字
【发布时间】:2012-09-26 04:13:59
【问题描述】:

我正在处理一个 sql 文件,试图制作一个脚本,该脚本可以带回显示的表中的所有数据或表中的所有数据加上 3 个月的数据。我不断收到一个错误,上面写着error 00905 missing keyword,我不明白为什么。

我查看了语法,对我来说一切都是正确的。我会在它说发生错误的地方放置一个标记(在第一个内部连接处)。我更改了所有表名以使其看起来更好,因为它超出了语法。

任何帮助都会非常感谢。这只是代码的一部分,但我确信它必须在这里。

WHEN Table_typ_cde = '1' -- Pulling all data --
  THEN
    INNER JOIN  Table   acp ON Table_oid = Table_oid
    INNER JOIN  Table   loss ON Table_oid = Table_oid
    LEFT OUTER JOIN Table veh ON Table_oid = Table_oid and Table_nbr=1
    INNER JOIN Table   brnch ON Table_OID = Table_oid
    INNER JOIN Table   a ON Table_OID = Table_oid
    INNER JOIN Table   c Table_OID = Table_oid
    INNER JOIN Table   s ON Table_OID = Table_oid
    INNER JOIN Table   r ON Table_OID = Table_oid
    INNER JOIN Table   grp ON Table_oid = Table_oid
    INNER JOIN Table on Table_id = Table_id
    WHERE Table_ID <> 2
 WHEN Table_cde = '2' -- Pulling all data within the last 3 months along with all present data --
 THEN
    INNER JOIN  Table   acp ON Table_oid = Table_oid
    INNER JOIN  Table   loss ON Table_oid = Table_oid
    LEFT OUTER JOIN Table veh ON Table_oid = Table_oid and Table_nbr=1
    INNER JOIN Table   brnch ON Table_OID = Table_oid
    INNER JOIN Table   a ON Table_OID = Table_oid
    INNER JOIN Table   c ON Table_OID = Table_oid
    INNER JOIN Table   s ON Table_OID = Table_oid
    INNER JOIN Table   r ON Table_OID = Table_oid
    INNER JOIN Table   grp ON Table_oid = Table_oid
    INNER JOIN Table on Table_id = Table_id
    WHERE Table_ID <> 2
    AND df.DATE_CREATED BETWEEN ADD_MONTHS(SYSDATE, -6)
    AND sysdate
END                                         
) core

【问题讨论】:

    标签: sql oracle syntax ora-00905


    【解决方案1】:

    您不能使用CASE 破坏JOIN。我在您的查询的某些部分看到了这一点,

    THEN
       INNER JOIN  Table   acp ON Table_oid = Table_oid
       INNER JOIN  Table   loss ON Table_oid = Table_oid
    

    这是错误的,您必须在INNER JOIN 关键字之前提供表名。

    【讨论】:

    • 所以你是说因为我已经开始了和内部连接然后和命令我不能在里面有一个 CASE 语句?
    • 如果我理解你的问题,那么是的。连接的简单语法是SELECT * FROM tableA INNER JOIN tableB on tableA.col = tableB.col,您可以添加case after ON`,但不能在JOIN之前或之前添加
    • 对不起,如果我感到困惑,但我的 CASE 语句不是在 ON,'ON Table_ID = Table_ID' 之后?我想运行出现错误的第一条语句,然后采用第一种情况或第二种情况。我需要一个 if 语句来选择要添加到第一个语句中的语句,并且看不到任何其他方法。
    • 你能发布整个查询吗?谢谢:D,这样我们就可以找到真正的错误在哪里
    【解决方案2】:

    您有两组看似相等的连接。然后你有一个你希望有条件地应用的日期过滤器。您需要在 WHERE 子句而不是 FROM 中应用它。有的这样的

    FROM  ... INNER JOIN  Table   acp ON Table_oid = Table_oid
        INNER JOIN  Table   loss ON Table_oid = Table_oid
        LEFT OUTER JOIN Table veh ON Table_oid = Table_oid and Table_nbr=1
        INNER JOIN Table   brnch ON Table_OID = Table_oid
        INNER JOIN Table   a ON Table_OID = Table_oid
        INNER JOIN Table   c ON Table_OID = Table_oid
        INNER JOIN Table   s ON Table_OID = Table_oid
        INNER JOIN Table   r ON Table_OID = Table_oid
        INNER JOIN Table   grp ON Table_oid = Table_oid
        INNER JOIN Table on Table_id = Table_id
    WHERE Table_ID <> 2
        AND (Table_cde = '1' 
              or ( Table_cde = '2' 
              and df.DATE_CREATED BETWEEN ADD_MONTHS(SYSDATE, -6) AND sysdate ))
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2018-02-24
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多