programing

Oracle SELECT TOP 10 레코드

coolbiz 2023. 3. 15. 23:08
반응형

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

반응형