2

Oracle 10g には、次の SQL があります。

select dog.id as dogId from CANINES dog order by dog.codename asc

戻り値:

id
--
204
203
206
923

このクエリを拡張して、この結果セット内の dog.id の oracle rownum を特定したいと考えています。

私が試してみました

select rownum from 
(select dog.id as dogId from CANINES dog order by dog.codename asc) 
where dog.id=206

しかし、これはうまくいきません (一致する dog.id に関係なく 1 を返します)。3に戻ると思っていました。

ご協力いただきありがとうございます!


ノート

http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

私はROWIDを使用する必要はないと確信しています

4

4 に答える 4

2

テーブル内の各行の一意の識別子が必要な場合は、ROWNUM ではなく ROWID が必要です。

ROWNUM は、少しの SQL が実行されるたびに変更できる疑似列です (クエリ時に解決されます)。

于 2009-02-10T21:14:25.987 に答える
0

これがうまくいくかどうかを確認してください:

答え

SELECT dog1.DogID, dog1.DogName, COUNT(*) AS rownumber
FROM #ids dog1, #ids dog2
WHERE dog2.DogName <= dog1.DogName
GROUP BY dog1.DogID, dog1.DogName
ORDER BY dog1.DogName

結果

DogID       DogName    rownumber
----------- ---------- -----------
204         Dog 1      1
203         Dog 2      2
206         Dog 3      3
923         Dog 4      4

DDL

CREATE TABLE #ids (DogID int NOT NULL PRIMARY KEY, DogName varchar(10) NOT NULL)
INSERT INTO #ids (DogID, DogName) VALUES (204, 'Dog 1')
INSERT INTO #ids (DogID, DogName) VALUES (203, 'Dog 2')
INSERT INTO #ids (DogID, DogName) VALUES (206, 'Dog 3')
INSERT INTO #ids (DogID, DogName) VALUES (923, 'Dog 4')
于 2009-02-10T21:18:32.887 に答える
0

これを実現するには、テーブルを変更してシーケンスを追加するのが最善です。行を削除する場合、これは粘着性になる可能性があります。おそらく、ステータス列または開始日モチーフを使用して、どの行がアクティブで返されるべきかを決定することをお勧めします。

于 2011-01-26T19:22:43.617 に答える