database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39536 게시물 읽기
No. 39536
SQL 쿼리 질문입니다(마농님 좀 도와주세요 ㅠ)
작성자
김병두(kirio1)
작성일
2012-07-11 13:36ⓒ
2012-07-11 14:13ⓜ
조회수
5,106

s e

----

1 3

3 6

7 7

8 12

16 20

28 29

31 37

 

데이터가 위와 같이 있고 s 는 시작값 e는 종료 값입니다.

s 와 e는 연속은 아니지만 s와 e 사이가 중복은 전혀 없습니다.

 

여기서 어떤 값이 s와 e 사이에 있는지 없는지 체크 하는 로직인데

위 예제에서 9 를 입력하면

8 12 의 값이 나오게 하는 쿼리네요..

 

쿼리로는

select * from test_tab where s < 9 and e > 9 

이렇게 될텐데..성능이 너무나 느립니다.

 

쿼리로 한번에 될지요... 

s 나 e 에는 인덱스가 있다고 가정하고

index_desc 와 rownum=1 로 데이터를 찾는 방법도 잇긴 하던데 로직이 불안해서 입니다.

 

sql 쿼리 개념적으로 위 결과를 만족하는 데이터를 효율적으로 찾을수 있을지 질문드립니다

이 글에 대한 댓글이 총 1건 있습니다.

-- 위 예시자료엔 3이 겹치네요.
-- 그렇다면 3을 조건으로주면 결과가 두개 나와야 하겠네요.
-- 혹시 3처럼 겹치는 부분이 없다면
-- Union 쿼리 둘중 하나만 사용하시면 됩니다.
SELECT *
  FROM (
        SELECT /*+ INDEX_DESC(test_tab idx_s) */ *
          FROM test_tab
         WHERE s <= :v
           AND ROWNUM = 1
         UNION
        SELECT /*+ INDEX(test_tab idx_e) */ *
          FROM test_tab
         WHERE e >= :v
           AND ROWNUM = 1
        )
 WHERE :v BETWEEN s AND e
;

마농(manon94)님이 2012-07-11 16:59에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39540오라클 blob필드에 이미지를 insert하고자 합니다. [1]
김승일
2012-07-13
5319
39538부분합계금액을 구하려면.. [1]
김인환
2012-07-12
6336
39537가로로 합계내기 [1]
질문자
2012-07-11
6104
39536SQL 쿼리 질문입니다(마농님 좀 도와주세요 ㅠ) [1]
김병두
2012-07-11
5106
39535group by rollup 했더니 같은 row가 2개씩 생겨요.. [2]
하수
2012-07-10
5908
39534그룹내의 첫번째 row를 구하고 싶습니다. [1]
신동화
2012-07-10
10055
39533세로를 가로로 바꾸기 [1]
초보
2012-07-09
7324
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다