【问题标题】:ORA-00933: SQL command not properly ended in subquery with joinORA-00933: SQL 命令未在带有连接的子查询中正确结束
【发布时间】:2011-09-15 12:41:39
【问题描述】:

自从我上次做 Oracle SQL 以来已经有一段时间了,希望有人能告诉我为什么我得到一个 933:

   SELECT TRIM(A.ACCOUNTNUMBER) AS INDBDebnmbr
, TRIM(A.VOUCHER) AS INinvoicenmbr
, A.DATE_ AS INinvoiceDate
, A.DUEDATE AS INinvoiceDueDate
, A.TXT AS INDescription
, A.EXCHANGECODE AS INCurrencyCode
, subq.AMOUNTMST AS INOriginalamount
, subq.SETTLEAMOUNTMST AS INpaidAmount
, subq.OPENAMOUNT AS INOpenAmount
FROM (
  SELECT DEBTRANS.VOUCHER AS VOUCHER, SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST
  , SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST
  , SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
  FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
  WHERE DEBTRANS.OPEN = 1 AND
  DEBTRANS.TRANSTYPE <> 9 AND
  (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 AND
  DEBTRANS.DATASET = 'FIK'
  GROUP BY DEBTRANS.VOUCHER) subq INNER JOIN DEBTRANS A ON A.VOUCHER = subq.VOUCHER

在 SQL Plus 中 提前致谢,

迈克尔

【问题讨论】:

  • 这个查询还有更多内容吗?我刚试过类似的,效果很好。
  • 我使用的是 Oracle 8i 吗?
  • WHERE DEBTRANS.OPEN ...中的OPEN有可能是关键字吗?
  • 不这么认为,SELECT subq.AMOUNTMST AS INOriginalamount , subq.SETTLEAMOUNTMST AS INpaidAmount , subq.OPENAMOUNT AS INOpenAmount FROM ( SELECT DEBTRANS.VOUCHER, SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST , SUM( DEBTRANS.SETTLEAMOUNTMST) 作为 SETTLEAMOUNTMST ,SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) 作为来自 XAL_SUPERVISOR.DEBTRANS DEBTRANS 的 OPENAMOUNT,其中 DEBTRANS.OPEN = 1 且 DEBTRANS.TRANSTYPE 9 且 (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) 0 AND DEBTRANS.DATASET = 'FIK' GROUP BY DEBTRANS.VOUCHER) subq / 运行良好
  • 这就是为什么总是在问题中指定环境很重要 - Oracle 版本、操作系统和版本等。

标签: sql oracle ora-00933 oracle8i


【解决方案1】:

您对使用 8i 的评论说明了这一点。 ANSI '92 Join 语法直到 9i 才在 Oracle 中实现。

您需要修改您的查询:

       SELECT TRIM(A.ACCOUNTNUMBER) AS INDBDebnmbr
    , TRIM(A.VOUCHER) AS INinvoicenmbr
    , A.DATE_ AS INinvoiceDate
    , A.DUEDATE AS INinvoiceDueDate
    , A.TXT AS INDescription
    , A.EXCHANGECODE AS INCurrencyCode
    , subq.AMOUNTMST AS INOriginalamount
    , subq.SETTLEAMOUNTMST AS INpaidAmount
    , subq.OPENAMOUNT AS INOpenAmount
    FROM (
      SELECT DEBTRANS.VOUCHER AS VOUCHER, SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST
      , SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST
      , SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
      FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
      WHERE DEBTRANS.OPEN = 1 AND
      DEBTRANS.TRANSTYPE <> 9 AND
      (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 AND
      DEBTRANS.DATASET = 'FIK'
      GROUP BY DEBTRANS.VOUCHER) subq,
      DEBTRANS A
 WHERE A.VOUCHER = subq.VOUCHER;

【讨论】:

  • 谢谢 DCookie,快到了.. 还是一个 933,可能是因为 'DEBTRANS A WHERE A.VOUCHER = subq.VOUCHER'​​?
【解决方案2】:

您要加入的 DEBTRANS 是什么,它是 XAL_SUPERVISOR.DEBTRANS 的另一个实例吗? 如果是这样,请不要在子查询中使用 DEBTRANS 作为别名,这会造成混淆。将其更改为其他内容并重试,例如

 SELECT TRIM(A.ACCOUNTNUMBER) AS INDBDebnmbr
, TRIM(A.VOUCHER) AS INinvoicenmbr
, A.DATE_ AS INinvoiceDate
, A.DUEDATE AS INinvoiceDueDate
, A.TXT AS INDescription
, A.EXCHANGECODE AS INCurrencyCode
, subq.AMOUNTMST AS INOriginalamount
, subq.SETTLEAMOUNTMST AS INpaidAmount
, subq.OPENAMOUNT AS INOpenAmount
FROM (
  SELECT dt.VOUCHER AS VOUCHER
  , SUM(dt.AMOUNTMST) AS AMOUNTMST
  , SUM(dt.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST
  , SUM(dt.AMOUNTMST - dt.SETTLEAMOUNTMST) AS OPENAMOUNT
  FROM XAL_SUPERVISOR.DEBTRANS dt
  WHERE dt.OPEN = 1 AND
  dt.TRANSTYPE <> 9 AND
  (dt.AMOUNTMST - dt.SETTLEAMOUNTMST) <> 0 AND
  dt.DATASET = 'FIK'
  GROUP BY dt.VOUCHER) subq INNER JOIN DEBTRANS A ON A.VOUCHER = subq.VOUCHER

【讨论】:

    【解决方案3】:

    而不是最后一行

    INNER JOIN DEBTRANS A ON A.VOUCHER = subq.VOUCHER

    使用

    INNER JOIN DEBTRANS A ON A.VOUCHER = subq.INinvoicenmbr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 2010-09-09
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多