【问题标题】:Oracle Query giving error "ORA-00933: SQL command not properly ended"Oracle 查询给出错误“ORA-00933:SQL 命令未正确结束”
【发布时间】:2026-02-14 12:50:02
【问题描述】:
SELECT *
FROM
  (SELECT *
   FROM RHSTRYWLN7.RESULT R
   INNER JOIN RHSTRYWLN7.PRODUCT P ON P.PRODUCT_CODE=R.PRODUCT_CODE
   WHERE SOURCE_GUID='i0ad0105800000151b126c1c49def32b4'
     AND DELETED='F'
     AND DATE_CREATED > systimestamp-90
     AND DATE_CREATED < systimestamp) AS A
INNER JOIN
  (SELECT S.result_guid,
          count(document_guid) DocCount
   FROM RHSTRYWLN7.RESULT S
   INNER JOIN RHSTRYWLN7.document D ON D.result_guid=S.Result_guid
   WHERE SOURCE_GUID='i0ad0105800000151b126c1c49def32b4'
     AND DELETED='F'
     AND DATE_CREATED > systimestamp-90
     AND DATE_CREATED < systimestamp
   GROUP BY S.result_guid) AS B ON A.Result_guid=B.Result_guid

我试图在 sqldeveloper 中运行上述查询并收到错误消息:

ORA-00933:SQL 命令未正确结束。

当我独立运行子查询时,它运行良好。可能是什么问题?

【问题讨论】:

  • 删除之前的别名
  • Oracle 不喜欢 AS 作为表别名,只适用于列...

标签: sql oracle


【解决方案1】:

在为子查询命名时,您不需要 As。你可以试试下面的

SELECT *
    FROM
      (SELECT *
       FROM RHSTRYWLN7.RESULT R
       INNER JOIN RHSTRYWLN7.PRODUCT P ON P.PRODUCT_CODE=R.PRODUCT_CODE
       WHERE SOURCE_GUID='i0ad0105800000151b126c1c49def32b4'
         AND DELETED='F'
         AND DATE_CREATED > systimestamp-90
         AND DATE_CREATED < systimestamp) A
    INNER JOIN
      (SELECT S.result_guid,
              count(document_guid) DocCount
       FROM RHSTRYWLN7.RESULT S
       INNER JOIN RHSTRYWLN7.document D ON D.result_guid=S.Result_guid
       WHERE SOURCE_GUID='i0ad0105800000151b126c1c49def32b4'
         AND DELETED='F'
         AND DATE_CREATED > systimestamp-90
         AND DATE_CREATED < systimestamp
       GROUP BY S.result_guid) B ON A.Result_guid=B.Result_guid

【讨论】:

    【解决方案2】:

    对表别名使用AS 关键字不是ANSI SQL 标准。 Oracle 不支持。

    这同样适用于您的情况中的 子查询,它在 FROM 子句中使用,称为 in-line view .不要使用AS 关键字。

    【讨论】:

    • 当然AS 的别名是标准SQL,它只是可选的。没有人知道为什么 Oracle 坚持不允许它用于表,而是用于列别名。当您启用语法突出显示时,它会使阅读 SQL 变得更加容易 :-) 并且标准 SQL 将 in-line view/sub-query Derived Table 命名。
    • 是的,派生表 :-)
    【解决方案3】:

    请尝试以下查询并检查

    SELECT R.*,
           count(document_guid) OVER (PARTITION BY result_guid) DocCount
      FROM RHSTRYWLN7.RESULT R
     INNER JOIN RHSTRYWLN7.PRODUCT P 
        ON P.PRODUCT_CODE=R.PRODUCT_CODE
     INNER JOIN RHSTRYWLN7.document D 
        ON D.result_guid=R.Result_guid
     WHERE SOURCE_GUID='i0ad0105800000151b126c1c49def32b4'
       AND DELETED='F'
       AND DATE_CREATED > systimestamp-90
       AND DATE_CREATED < systimestamp
    

    【讨论】:

    • 您应该解释为什么您建议的代码可以解决问题。
    • @Nanhydrin 在这里我们在结果上加入产品和文档表。两个选择的谓词似乎是相同的。分区上的分析函数计数将给出按 result_guid 分组后的计数(PARTITION 子句用于对记录进行分组)。