ORA-00905:无法将Mysql / MMSQL语法转换为oracle语法

时间:2010-10-01 13:18:48

标签: sql oracle plsql ora-00905

我在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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这只是发布查询并显示问题(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,但迈克尔的回答是正确的(因为他删除了 AS

AS抛出此错误

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

(在11g r1中测试)

答案 2 :(得分:0)

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

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