SQLのrownumの特定の行?(Oracle db)
質問
Oracle10g、このSQL:
select dog.id as dogId from CANINES dog order by dog.codename asc
を返す:
id
--
204
203
206
923
またこのクエリを決定するoracle rownumの犬。idこのresultset.
していました
select rownum from
(select dog.id as dogId from CANINES dog order by dog.codename asc)
where dog.id=206
われていないわけではありません事もでは1を返しますな。idに一致します。見返3.
おります。
注記
http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
っを使用する必要はありませんrowid
解決
私はすなわち、あなたがしたいことは分析関数(RANK、DENSE_RANK
、またはROW_NUMBER
)を使用することである疑います。
SELECT rnk
FROM (select dog.id as dogId,
ROW_NUMBER() OVER( ORDER BY dog.codename ASC ) rnk
from CANINES dog )
WHERE dogId = 206
イヌテーブルのID列が一意でなかった場合は、は、RANK、DENSE_RANK
、およびROW_NUMBER
は)違った関係を扱っていました。
あなたはもっぱらROWNUMでこれを行うにしたい場合は、
SELECT rn
FROM (
SELECT dogId, rownum rn
FROM (select dog.id as dogId
from CANINES dog
order by dog.codename ASC) inner
) middle
WHERE dogId = 206
他のヒント
あなたがROWIDを必要とする表の各行の一意の識別子後にしている場合は、ありませんROWNUMます。
ROWNUMは、SQLのビットが実行されるたびに変更することができます疑似である(それは、クエリ時に働いています)。
この作品専用に作成する方法もあります。
答え
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')
これを達成するためには、テーブルを変更し、シーケンスを追加するのがベストでしょう。あなたが行を削除しようとする場合、これは粘着性が得ることができます。ここで、おそらくより良い練習は、ステータス列を使用することや、アクティブであり、返される行を決定するモチーフ終了日開始します。
所属していません StackOverflow