복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.시험

    시험

    SELECT * FROM users FETCH NEXT 10 ROWS ONLY;
    
  5. ==============================

    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
    
  6. from https://stackoverflow.com/questions/2498035/oracle-select-top-10-records by cc-by-sa and MIT license