首页 > 解决方案 > Oracle 数据库错误 907:ORA-00907:缺少右括号

问题描述

我直接从 SQL 开发人员那里转移了这段代码。在那里完美运行。

SELECT 
    a.INCIDENT_NUMBER,
    a.DETAILED_DESCRIPTION,    
    a.INCIDENT_ROOT_CAUSE

FROM 
    N_EVALUATION as a

INNER JOIN N_DISPOSITION as b
    ON (a.INCIDENT_NUMBER = b.INCIDENT_NUMBER) 

WHERE
    b.DISPOSITION_LINE_NUM in (NULL, 1) AND
    a.ACTIVE_FLAG = 'Y' AND
    b.ACTIVE_FLAG = 'Y' AND
    a.DETAILED_DESCRIPTION IS NOT NULL

但是,当我将相同的确切代码传输到 Tableau 以创建自定义 SQL 查询时。它给了我一个错误;

与数据源通信时出错。连接错误:Tableau 无法连接到数据源。Oracle 数据库错误 907:ORA-00907:缺少右括号

这让我完全被难住了,不知道该怎么做。非常感谢任何帮助或建议。我更担心缺少右括号而不是连接不良。

标签: sqloracletableau-api

解决方案


ASFROM子句中删除。Oracle 不承认这一点。

另外,这个条件:

 b.DISPOSITION_LINE_NUM in (NULL, 1)

不做你所期望的。b.DISPOSITION_LINE_NUM如果is ,它永远不会评估为 true NULL

您应该将其替换为:

 (b.DISPOSITION_LINE_NUM IS NULL OR b.DISPOSITION_LINE_NUM = 1)

否则,您的查询看起来像是有平衡括号,但您应该将其写为:

SELECT e.INCIDENT_NUMBER, e.DETAILED_DESCRIPTION, e.INCIDENT_ROOT_CAUSE
FROM N_EVALUATION e JOIN
     N_DISPOSITION d
     ON e.INCIDENT_NUMBER = d.INCIDENT_NUMBER
WHERE (d.DISPOSITION_LINE_NUM IS NULL OR d.DISPOSITION_LINE_NUM = 1) AND
      e.ACTIVE_FLAG = 'Y' AND
      d.ACTIVE_FLAG = 'Y' AND
      e.DETAILED_DESCRIPTION IS NOT NULL;

笔记:

  • 用户有意义的表别名而不是任意字母(这使用缩写)。
  • 不要asFROM子句中使用。
  • 小心NULL比较。

最后,您的原始查询相当于:

SELECT e.INCIDENT_NUMBER, e.DETAILED_DESCRIPTION, e.INCIDENT_ROOT_CAUSE
FROM N_EVALUATION e JOIN
     N_DISPOSITION d
     ON e.INCIDENT_NUMBER = d.INCIDENT_NUMBER
WHERE d.DISPOSITION_LINE_NUM = 1 AND
      e.ACTIVE_FLAG = 'Y' AND
      d.ACTIVE_FLAG = 'Y' AND
      e.DETAILED_DESCRIPTION IS NOT NULL;

这没有括号。 所以它不能返回那个特定的错误。


推荐阅读