ORA-00905: Проблема с преобразованием синтаксиса Mysql / MMSQL в синтаксис Oracle - PullRequest
0 голосов
/ 01 октября 2010

У меня проблемы с запуском приведенного ниже кода в БД 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 ]

2 голосов
/ 01 октября 2010
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 голос
/ 01 октября 2010

Это просто для того, чтобы опубликовать запрос и показать проблему (Микал ответил на него правильно):

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 )

AS выдает эту ошибку

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

(проверено в 11g r1)

0 голосов
/ 02 октября 2010

Другие ответы верны, но если вы хотите воспользоваться преимуществами Oracle, вы можете использовать аналитические функции. Этот метод требует только одного сканирования таблицы вместо двух:

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