【问题标题】:ORA-00905: Trouble converting Mysql/MMSQL syntax to oracle syntaxORA-00905: 无法将 Mysql/MMSQL 语法转换为 oracle 语法
【发布时间】:2011-04-19 20:45:24
【问题描述】:

我在 Oracle DB 上运行以下代码时遇到问题。不太清楚为什么 - 得到下面的错误

ORA-905 错误 - 缺少关键字

这在 MSSQL 和 MYSQL 上运行良好。

任何关于如何修复的指示将不胜感激。

SELECT product.productId, product.version
 FROM product 
INNER JOIN (SELECT productId,
                   MAX(version) AS MaxVersion
              FROM product
          GROUP BY productId) AS vTbl ON product.productId= vTbl.productId 
                                     AND product.version= vTbl.MaxVersion

【问题讨论】:

    标签: sql oracle plsql ora-00905


    【解决方案1】:
    SELECT
      product.productId, product.version
    FROM
        product JOIN
        (
                SELECT
                        productId,
                        MAX(version) AS MaxVersion
                FROM
                        product
                GROUP BY productId
    
       ) vTbl ON
                    product.productId= vTbl.productId AND
                    product.version= vTbl.MaxVersion
    

    【讨论】:

      【解决方案2】:

      这只是为了发布查询并显示问题(Micheal 正确回答了这个问题):

      AS  VTBL
      

      需要简单

      VTBL 
      

      这样

      WITH product AS(
       SELECT 1 productId, 2 version FROM DUAL
       union
       SELECT 2 productId, 2 version FROM DUAL
       UNION
       SELECT 3 productId, 3 version FROM DUAL
       union
       SELECT 2 productId, 6 version FROM DUAL
       UNION
       SELECT 3 productId, 4 version FROM DUAL
       UNION
       SELECT 4 productId, 5 version FROM DUAL 
      )
      SELECT
             PRODUCT.PRODUCTID, 
         product.version
          FROM
                  PRODUCT 
          INNER JOIN
                  (
                          SELECT
                                  productId,
                                  MAX(version) AS MaxVersion
                          FROM
                                  product
                          GROUP BY productId
      
                 ) /*as*/  VTBL ON
                              product.productId= vTbl.productId AND
                              product.version= vTbl.MaxVersion;
      

      我倾向于更明确,所以我会保留 INNER JOIN,但 Michael 的回答是正确的(因为他删除了 AS

      AS 抛出此错误

      ORA-00905: missing keyword
      00905. 00000 -  "missing keyword"
      *Cause:    
      *Action:
      

      (在 11g r1 中测试)

      【讨论】:

        【解决方案3】:

        其他答案是正确的,但如果您想利用 Oracle,您可能需要使用分析函数。这种方法只需要一次表扫描而不是两次:

        select productId, maxVersion
        from
        (
          select product.productId, version
            ,max(version) over (partition by productId) maxVersion
          from product
        )
        where version = maxVersion;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          • 2015-03-19
          • 1970-01-01
          • 2015-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多