0

良い一日、

データベースがすでに DB2 から Oracle に変更されているため、一部のプログラム コード (主に SQL コード) を変更したいと考えています。

これは私が成功した例の1つですが、私はそれについてよく理解していません.Googleからそれを見つけることはできません.

以下は、元の SQL クエリ コードです (DB2 を使用)。

SELECT * 
FROM (SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum 
FROM IBSADMIN.CCGROUP T0 
WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') AS tname
WHERE rownum BETWEEN 1 AND 20

私が編集した後のSQLクエリコードは次のとおりです(Oracleからデータを正常に取得できます):

SELECT * 
FROM (SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum1 
FROM IBSADMIN.CCGROUP T0 
WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') tname
WHERE rownum1 BETWEEN 1 AND 20

私が分析したように、 を に変更しなかった場合、エラーが発生します。エラーは です。したがって、に変更rownumします。DB2のキーワードである必要があると思います。Oracle にもこのようなキーワードはありますか?rownum1ORA-00923: FROM keyword not found where expectedrownum1rownum

行 4 の最後の部分では、DB2 コードから、 で終わりAs tnameます。同じことをOracleコードに入れると、エラーが発生しますORA-00933: SQL command not properly ended。したがって、私は消去しAsます。意味がよくわかりませんAs tname. 括弧内の SQL クエリとして:

(SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum1 
    FROM IBSADMIN.CCGROUP T0 
    WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC')

それは私に2列を返すのでAs tname、2列との相互作用がどのようになっているのかわかりません。

親切なアドバイス。

4

2 に答える 2

2
  1. rownumはOracleの予約語です。Oracleではrownum、結果セットの(順序付け前の)行番号を取得するために参照できる疑似列です。そのため、Oracle に変換するときにエイリアスを変更する必要があります。rownum--とは明らかに異なるもの、rnまたはrnk適切な選択肢であるものが望ましいと思います。

  2. tnameクエリのインライン ビューのエイリアスです。Oracle では、ASキーワードを使用してテーブル エイリアスを割り当てることはできません (有効な理由である列エイリアスを定義するときにオプションで使用できますが、完全AS rownum1に削除することもできます)。ASこの場合、tnameエイリアスは使用されないため、Oracle では省略できます。一部のデータベース (SQL Server) では、インライン ビューのエイリアスが必要であることを知っています。DB2 でテーブル エイリアスが必要かどうかはわかりません。

クエリを正しく変更したようですね (ただし、 の代わりに選択したエイリアスに疑問を呈しますrownum)。

于 2013-10-01T03:57:38.320 に答える