2009-02-10 83 views
2

在Oracle 10g中,我有這樣的SQL:SQL返回特定行的rownum? (使用Oracle數據庫)

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

返回:

id 
-- 
204 
203 
206 
923 

我要擴展這個查詢,以確定在dog.id神諭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

回答

9

我懷疑你想要的是使用的解析函數(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_RANKROW_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 
2

ROWID,而不是ROWNUM。

ROWNUM是可以每次執行一個位的SQL時間改變虛列(它制定了在查詢時)

+0

我想知道在我的查詢中給定ID的排序行號,所以我想我想要rownum。謝謝。 – jedierikb 2009-02-10 21:24:11

+1

說真的,堅持OP。你可以在你處理OP後回答你希望他們問的問題。 – 2009-02-10 21:48:18

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') 
0

爲了做到這一點,那將是最好的改變表並添加一個序列。如果你打算刪除行,這可能會變得粘稠。在哪裏,或許更好的做法是使用狀態列或開始 - 結束日期motif來決定哪些行是活動的並應該返回。