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;
Другие вопросы по тегам