ORA-00905: Проблема с преобразованием синтаксиса Mysql/MMSQL в синтаксис Oracle
У меня проблемы с запуском приведенного ниже кода на БД Oracle. Не слишком уверен, почему - получить ошибку ниже
Ошибка 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 ответа
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
Это просто, чтобы опубликовать запрос и показать проблему (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;
Мне, как правило, нравится быть явным, поэтому я бы оставил ВНУТРЕННЕЕ СОЕДИНЕНИЕ, но ответ Майкла правильный (так как он удалил АС)
AS выдает эту ошибку
ORA-00905: missing keyword
00905. 00000 - "missing keyword"
*Cause:
*Action:
(проверено в 11g r1)
Другие ответы верны, но если вы хотите воспользоваться преимуществами Oracle, вы можете использовать аналитические функции. Этот метод требует только одного сканирования таблицы вместо двух:
select productId, maxVersion
from
(
select product.productId, version
,max(version) over (partition by productId) maxVersion
from product
)
where version = maxVersion;