[SQL] 오라클 SELECT TOP 10 기록
SQL오라클 SELECT TOP 10 기록
나는 오라클의 SQL 문이있는 큰 문제가 있습니다. 나는 10 기록은 다른 선택 문에서 목록에없는 STORAGE_DB에 의해 주문 TOP을 선택합니다.
이것은 모든 레코드에 대한 벌금을 작동합니다 :
SELECT DISTINCT
APP_ID,
NAME,
STORAGE_GB,
HISTORY_CREATED,
TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE
FROM HISTORY WHERE
STORAGE_GB IS NOT NULL AND
APP_ID NOT IN (SELECT APP_ID
FROM HISTORY
WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009')
하지만 추가하고 때
AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC
나는 "무작위"기록의 어떤 종류를 얻고있다. 제한이 주문하기 전에 장소에 필요하기 때문에 나는 생각한다.
누군가가 좋은 솔루션을 제공합니까? 또 다른 문제 :이 쿼리는 정말 느리다 (10,000 + 기록)
해결법
-
==============================
1.아래로 하위 쿼리에서 현재 쿼리를 넣어해야합니다 :
아래로 하위 쿼리에서 현재 쿼리를 넣어해야합니다 :
SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009') ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10
이 반환 된 후 오라클은 결과에 ROWNUM을 적용합니다. 당신은 반환 된 후 하위 쿼리가 필요하므로, 결과를 필터링 할 필요가있다. 또한 최고-N의 결과를 얻을 수 RANK () 함수를 사용할 수 있습니다. 성능을 위해 NOT NOT IN 대신에 존재 사용해보십시오. 이상이를 참조하십시오.
-
==============================
2.당신이 오라클 12C를 사용하는 경우, 사용 :
당신이 오라클 12C를 사용하는 경우, 사용 :
SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009') ORDER BY STORAGE_GB DESC FETCH NEXT 10 ROWS ONLY
추가 정보 : http://docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html
-
==============================
3.성능 저하에 관해서 거기가 될 수 가지의 수, 그리고 정말 별도의 질문이되어야한다. 그러나, 문제가 될 수 하나 개 분명한 것은이있다 :
성능 저하에 관해서 거기가 될 수 가지의 수, 그리고 정말 별도의 질문이되어야한다. 그러나, 문제가 될 수 하나 개 분명한 것은이있다 :
WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009')
HISTORY_DATE 정말 날짜 열을이며 인덱스가있는 경우 다음이 재 작성은 더 잘 수행됩니다 :
WHERE HISTORY_DATE = TO_DATE ('06.02.2009', 'DD.MM.YYYY')
데이터 형식 변환은 B-tree 인덱스의 사용을 불가능하게하기 때문이다.
-
==============================
4.시험
시험
SELECT * FROM users FETCH NEXT 10 ROWS ONLY;
-
==============================
5.ROWNUM은 ORDER BY에 전에 적용되기 때문에 당신은 분명히 임의의 집합을 얻을. 쿼리가 최고 열 급여를 선택하려면 them.0 처음 10 행과 종류를한다 그래서 당신은 하위 쿼리에서 분석 함수를 사용해야하고 필터가 :
ROWNUM은 ORDER BY에 전에 적용되기 때문에 당신은 분명히 임의의 집합을 얻을. 쿼리가 최고 열 급여를 선택하려면 them.0 처음 10 행과 종류를한다 그래서 당신은 하위 쿼리에서 분석 함수를 사용해야하고 필터가 :
select * from (select empno, ename, sal, row_number() over(order by sal desc nulls last) rnm from emp) where rnm<=10
from https://stackoverflow.com/questions/2498035/oracle-select-top-10-records by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 된 PreparedStatement의 SQL을받을 수 있나요? (0) | 2020.03.16 |
---|---|
[SQL] SQL IN 절 1000 항목 제한 (0) | 2020.03.16 |
[SQL] IN 대 또는 WHERE 절 SQL에 (0) | 2020.03.16 |
[SQL] 어떻게 오라클에서 상위 1을해야합니까? (0) | 2020.03.16 |
[SQL] 어떻게 MySQL의에서 다음 / 이전 기록을 얻으려면? (0) | 2020.03.16 |