在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
但是这种效果不是很好(不管是哪只狗都会返回1。我匹配)。我期待着回来3。
感谢您的帮助!
备注的
http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
我很确定我不需要使用rowid
答案 0 :(得分: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
如果CANINES表中的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
答案 1 :(得分:2)
如果您在表格中每行的唯一标识符之后,则需要ROWID,而不是ROWNUM。
ROWNUM是一个伪列,可以在每次执行一些SQL时更改(它在查询时解决)
答案 2 :(得分: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')
答案 3 :(得分:0)
为了实现这一目标,最好改变表格并添加序列。如果您打算删除行,这可能会变得棘手。在哪里,或许更好的做法是使用状态列或开始结束日期主题来决定哪些行是活动的并且应该返回。