【问题标题】: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;