Oracle SELECT TOP 10 레코드
Oracle의 SQL 문에 큰 문제가 있습니다.다른 선택문에서 목록에 없는 STORGE_DB가 발주한 TOP 10 Records를 선택하고 싶습니다.
이것은 모든 레코드에서 정상적으로 동작합니다.
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
'랜덤' 레코드 같은 게 나오고 있어주문 전에 한도가 정해져 있기 때문이라고 생각합니다.
누군가 좋은 해결책을 가지고 있나요?또 다른 문제:이 쿼리는 매우 느립니다(10k 이상의 레코드).
다음과 같이 현재 쿼리를 서브쿼리에 넣어야 합니다.
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
Oracle은 반환된 결과에 로넘을 적용합니다.
결과를 반환한 후 필터링해야 하므로 하위 쿼리가 필요합니다.RANK() 함수를 사용하여 Top-N 결과를 얻을 수도 있습니다.
퍼포먼스를 위해NOT EXISTS
대신해서NOT IN
자세한 내용은 여기를 참조해 주세요.
Oracle 12c를 사용하는 경우 다음을 사용합니다.
다음 N개 행만 가져오기
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
해라
SELECT * FROM users FETCH NEXT 10 ROWS ONLY;
실적 부진에 대해서는 여러 가지가 있을 수 있으며, 그것은 정말 별개의 문제여야 한다.단, 문제가 될 수 있는 것이1가지 있습니다.
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 인덱스의 사용이 비활성화되기 때문입니다.
ROWNUM이 ORDER BY보다 먼저 적용되기 때문에 명백히 랜덤 세트를 얻을 수 있습니다.따라서 쿼리는 처음 10개의 행을 사용하여 정렬합니다.0상위 10개의 급여를 선택하려면 하위 쿼리에서 분석 함수를 사용한 다음 다음을 필터링해야 합니다.
select * from
(select empno,
ename,
sal,
row_number() over(order by sal desc nulls last) rnm
from emp)
where rnm<=10
이 쿼리를 사용하여 Oracle의 상위 레코드를 선택할 수 있습니다.레이크시 B
User_info에서 *를 선택합니다.여기서 id >=(User_info에서 max(id)-10을 선택합니다).
언급URL : https://stackoverflow.com/questions/2498035/oracle-select-top-10-records
'programing' 카테고리의 다른 글
몽고에서 $addToSet 키를 지정할 수 있습니까? (0) | 2023.03.15 |
---|---|
require("history/createBrowserHistory") 대신 require("history").createBrowserHistory를 응답합니다. (0) | 2023.03.15 |
사용자가 열려 있는 모든 탭에서 로그아웃할 때 사용자를 자동으로 로그아웃하려면 어떻게 해야 합니까? (0) | 2023.03.15 |
LOAD DATA INFILE 오류 코드: 13 (0) | 2023.01.27 |
도커 "ERROR: 네트워크에 할당하는 기본값 중 중복되지 않는 사용 가능한 IPv4 주소 풀을 찾을 수 없습니다." (0) | 2023.01.27 |