Oracle SQL에서 한 행만 선택하는 방법은 무엇입니까?


110

oracle 구문을 사용하여 table에서 한 행만 선택하고 싶습니다 DUAL. 예를 들어 다음 쿼리를 실행하고 싶습니다.

SELECT user 
  FROM DUAL

... 40 개의 레코드가있을 것입니다. 하지만 기록은 하나만 필요합니다. ... 그리고 나는 WHERE절 없이 그것을 실현하고 싶습니다 .

table_name 필드에 다음과 같은 것이 필요합니다.

SELECT FirstRow(user) 
  FROM DUAL

1
Oracle 버전은 무엇입니까? ROWNUM 또는 ROW_NUMBER (9i +)를 사용하면 WHERE 절이 필요함을 의미합니다
OMG Ponies

1
테이블 이름을 지으 셨나요 dual?
ypercubeᵀᴹ 0:25에

1
@ypercube dual는 오라클의 시스템 테이블입니다

4
@Ben, 당신은 정말로라는 테이블을 만들면 안됩니다 DUAL. #define TRUE 0C에서 와 비슷 합니다. 물론 여러분에게도 효과가있을 수 있지만 미래의 개발자는 여러분을 싫어할 것입니다.
Jeffrey Kemp

3
실제로 뛰려고 했습니까 select user from dual? 그렇지 않다면 그것을 시도하고 당신이 얻는 것을보십시오. 표준 Oracle 시스템에서는 명령을 실행중인 사용자를 다시 찾을 수 있습니다.
섀넌 세브란스

답변:


169

ROWNUM을 사용합니다.

즉.

SELECT user FROM Dual WHERE ROWNUM = 1

http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm


내가 말할 수있는 @ypercube는 그렇습니다. (적어도 oracle10g 설치에서는 작동합니다.)

@bdares : 네, 작동합니다. 그러나 당신의 대답은 아닙니다 order by.
ypercubeᵀᴹ

1
예. ROWNUM은 결과를 열거하는 결과 집합에 추가되는 특수 열입니다. 이를 사용하여 여러 명을 선택할 수도 있습니다. 예를 들어, 가장 높은 급여를받는 10 명의 직원을 찾으려면 "SELECT user FROM Employees WHERE ROWNUM <= 10 ORDER BY SALARY DESCENDING"이라고 말할 수 있습니다.
mindvirus

10
@mkdess : 아니, ORDER BY애프터 적용됩니다 WHERE.
ypercubeᵀᴹ

15
당신은 필요합니다 :SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
ypercubeᵀᴹ 0:33에

49

댓글 중 하나에 숨겨진이 "솔루션"을 찾았습니다. 잠시 동안 그것을 찾고 있었기 때문에 나는 그것을 조금 강조하고 싶습니다 (아직 주석을 달거나 그런 일을 할 수 없습니다 ...), 그래서 이것은 내가 사용한 것입니다 :

SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1

이렇게하면 [Date]가 항상 SYSDATE를 통해 삽입된다고 가정하고 테이블의 최신 항목에서 원하는 [Column] 항목이 인쇄됩니다.


ROWID기록을 삭제하지 않고 항상 마지막으로 삽입 / 수정 된 기록에 관심이있는 한으로 주문하는 경우에도 작동합니다 .
vapcguy

@vapcguy : 테이블에서 행을 삭제하지 않더라도 ROWID가 정렬 될 것이라고 기대하지 마십시오! 지금은 작동하더라도 향후 버전에서 작동한다는 보장은 없습니다.
D. Mika

@ D.Mika 실제로 지금 작동하고 레코드를 추가 / 제거 / 업데이트 / 삭제하지 않으면 문제가 없어야합니다. 레코드는 실제로 변경하는 경우에만 변경할 수 있습니다. ROWID오라클에 의해 어떻게 든 무작위로 수정 된다는 오해가 있습니다. 그렇지 않습니다. 행을 실제로 수정하는 것을 기반으로합니다. 즉, 행을 삭제 한 다음 삽입합니다. 삽입 된 항목은 이전 항목의 ROWID. 업데이트되지 않는 정적 테이블과 같은 것들이 있습니다. 미국에서 같은 상태는 좋은 예입니다. 이것이 변경되면 어쨌든 다른 영향을 미칠 수 있습니다.
vapcguy

@vapcguy : 음, 거의 맞습니다. 그러나 ROWID를 변경하는 다른 작업이 있습니다. 어떤 이유로 테이블을 내보내거나 가져 오면 어떻게됩니까? 다른 작업이 있지만 그중 일부는 ENABLE ROW MOVEMENT가 필요합니다. 앞으로 변경 될 수있는 구현 세부 사항에 의존하는 것은 좋지 않다고 말하고 싶습니다.
D. Mika

@ D.Mika 나는 그것이 ROWID변경 될 수있는 작업이 있다면 , 좋은 DBA는 그것들을 찾아보고 내가 설명한 것처럼 정적 테이블에 영향을 미칠 가능성이 있다면 피할 수있는 일을 할 것이라고 확신합니다. 응용 프로그램 만 작동해야합니다. SELECT대신 명령문을 사용 하여 테이블 내보내기를 수행 할 수 있습니다 . 가져 오기는 한 번만 발생하고 다시는 발생하지 않습니다. 나는 당신의 요점을 이해합니다.주의는 분명히 필요하지만 문제는 피할 수 없습니다.
vapcguy

35

이 구문은 Oracle 12c에서 사용할 수 있습니다.

select * from some_table fetch first 1 row only;
select * from some_table fetch first 1 rows only;
select * from some_table fetch first 10 row only;
select * from some_table fetch first 10 rows only;

^^ 원하는 복수의 행 수에 관계없이 행 또는 행 (복수)을 사용할 수 있음을 보여주고 싶었습니다.)


1
select * from some_table fetch first 1 row only; 내 swl devloper 나 SQL에서 작동하지 않고 오류가 발생했습니다.
nikhil sugandh

Oracle 12c를 사용하고 있습니까?
mancini0

잘 모르겠지만 열면 다음과 같이 표시됩니다. SQL * PLus Release 10.1.0.4.2 is it not 12 c
nikhil sugandh aug

맞습니다-버전 10.1.xxx를 사용하고있을 가능성이 높습니다. SELECT * FROM V $ VERSION
mancini0

10

Oracle DB 테이블의 첫 번째 행을 가져 오기 위해 세 가지 선택 사항이 있습니다.

1) select * from table_name where rownum= 1가장 좋은 방법

2) select * from table_name where id = ( select min(id) from table_name)

삼)

select * from 
    (select * from table_name order by id)
where rownum = 1

답변 해 주셔서 감사합니다. 3) "nowrum = 1"은 아마도 "rownum = 1"로 변경되어야합니다.
Andre Nel

7

내가 아는 dual한 Oracle 의 테이블은 행이 하나 뿐인 특수 테이블입니다. 따라서 이것으로 충분합니다.

SELECT user
FROM dual

이중에서의 사실이 아니다 선택 사용자는 당신에게 모든 사용자를 제공해야
벤에게


1
.. 방금 내 시스템에서 사용해 보았고 ypercube 및 모든 관련 문서 언급으로 작동합니다. @ 벤
Sathyajith 바트

1
@Ben dual은 카탈로그보기가 아니며 "모든 사용자"를 표시하지 않습니다. 이 목적을 위해 ALL_USERS와 같은보기를 사용합니다.
makrom

7

👌 대답은 다음과 같습니다.

중첩 된 쿼리를 다음과 같이 사용해야합니다.

SELECT *
FROM ANY_TABLE_X 
WHERE ANY_COLUMN_X = (SELECT MAX(ANY_COLUMN_X) FROM ANY_TABLE_X) 

=> PL / SQL에서 "ROWNUM = 1"은 TSQL의 "TOP 1"과 같지 않습니다.

따라서 다음과 같은 쿼리를 사용할 수 없습니다. "select * from any_table_x where rownum = 1 order by any_column_x;" oracle이 첫 번째 행을 가져 오므로 order by 절을 적용합니다.


1
답변에 대한 설명을 추가하십시오
hgwhittle 2014 년

특별한 이유없이 비정상적인 구문은 피해야합니다. 이 경우 테스트 케이스 또는 버그 번호를 제공하면 도움이됩니다. 의 이상한 문제를 막연하게 기억 rownum = 1하지만, 오래된 버그가 더 이상 코드에 영향을주지 않도록해야합니다.
Jon Heller 2014 년

7
@hgwhittle, Fuat가 올바른 이유는 ROWNUM이 'ordery by'에 대해 신경 쓰지 않기 때문입니다. 찾을 수있는 첫 번째 레코드를 잡고 즉시 반환합니다. 즉, ROWNUM 한정자는 "Order By"명령을 전혀 고려하지 않습니다. 나는 그것이 사실이 아니 었으면 좋겠지 만 중첩 된 쿼리를 사용하기 위해 Fuat가 정확합니다.
Eric Milliot-Martinez

5

limit 1Oracle 에는 조건 (MySQL / PostgresSQL)이 없으므로 지정해야합니다.where rownum = 1 .


5

"FirstRow"는 제한 사항이므로 where절이 아닌 select절에 위치합니다. 그리고 그것은 rownum이라고 불립니다.

select * from dual where rownum = 1;

1
ORDER BY순서 는 where 절 이후 에만 발생하므로 와 조합하면 예상대로 작동하지 않습니다 . 즉, 정렬 된 특정 쿼리의 맨 위를 얻기 위해 rownum은 완전히 쓸모가 없습니다.
Nyerguds 2013 년

@Nyerguds, 이것은 절반에 불과합니다. WhereView 쿼리와 함께 order by를 사용할 수 있습니다 .
gdoron 모니카 지원하고

4
그래서 SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1? 글쎄, 작동 할 수 있지만 꽤 멍청 해 보인다, tbh.
Nyerguds 2013 년

2

행이 있으면 다음을 시도하십시오.

select max(user)  
from table;

Where 절이 없습니다.


9
확실히 그것은 단지 자신을 위해 그것을 밖으로 시도하는 당신을 위해 초가 소요됩니다
매트 Donnan에게

1
select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 

1

select a.user from (select user from users order by user) a where rownum = 1

성능이 가장 좋으며 다른 옵션은 다음과 같습니다.

select a.user 
from ( 
select user, 
row_number() over (order by user) user_rank, 
row_number() over (partition by dept order by user) user_dept_rank 
from users 
) a 
where a.user_rank = 1 or user_dept_rank = 2

다른 하위 집합을 원 RANK()하지만 row_number() over(...)그룹화가 필요하지 않기 때문에 사용할 수도 있다고 생각 합니다.


0

하위 쿼리가 가장 적은 정렬 된 결과의 첫 번째 행만 반환하려면 다음을 시도하십시오.

select *
  from ( select a.*
              , row_number() over ( order by sysdate_col desc ) as row_num
           from table_name a )
  where row_num = 1;

여기서 sysdate_col은 정렬하려는 열의 이름이며 물론 table_name은 정렬 된 데이터를 가져올 테이블의 이름입니다.
Jody Fedor

-1

보다 유연함 select max():

select distinct first_row(column_x) over (order by column_y,column_z,...) from Table_A
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.