문제

Oracle 10G에는이 SQL이 있습니다.

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

반환 :

id
--
204
203
206
923

이 쿼리를 확장하여 개의 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이 반환됩니다). 나는 돌아올 것으로 기대했다.

당신의 도움을 주셔서 감사합니다!


메모

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

rowid를 사용할 필요가 없다고 확신합니다.

도움이 되었습니까?

해결책

나는 당신이 원하는 것이 분석 기능을 사용하는 것입니다 (순위, 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 열이 고유하지 않으면 순위, 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

다른 팁

테이블에서 각 행의 고유 식별자를 사용하는 경우 Rownum이 아닌 Rowid가 필요합니다.

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

이를 달성하기 위해 테이블을 변경하고 시퀀스를 추가하는 것이 가장 좋습니다. 행을 삭제하려면 끈적 거리게 될 수 있습니다. 아마도 더 나은 관행은 상태 열 또는 스타트 엔드 데이트 모티프를 사용하여 어떤 행이 활성화되어 있고 반환 해야하는지 결정하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top