0

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
4

3 に答える 3

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
于 2010-10-01T13:21:33.637 に答える
1

これは、クエリを投稿して問題を表示するためのものです (マイケルはこれに正しく答えました):

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でテスト済み)

于 2010-10-01T16:32:52.913 に答える
0

他の答えは正しいですが、Oracle を利用したい場合は、分析関数を使用することをお勧めします。この方法では、テーブル スキャンが 2 つではなく 1 つだけ必要です。

select productId, maxVersion
from
(
  select product.productId, version
    ,max(version) over (partition by productId) maxVersion
  from product
)
where version = maxVersion;
于 2010-10-02T03:45:23.173 に答える