Oracle SELECT TOP 10 records

Ik heb een groot probleem met een SQL-instructie in Oracle. Ik wil de TOP 10 Records selecteren die zijn besteld door STORAGE_DB die niet in een lijst staan van een andere select-opdracht.

Deze werkt prima voor alle 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') 

Maar als ik

. toevoeg

AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC

Ik krijg een soort “willekeurige” records. Ik denk omdat de limiet vóór de bestelling ingaat.

Heeft iemand een goede oplossing? Het andere probleem: deze zoekopdracht is erg traag (10k+ records)


Antwoord 1, autoriteit 100%

U moet uw huidige zoekopdracht in een subquery plaatsen, zoals hieronder:

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 is van toepassing Rownum naar het resultaat nadat het is geretourneerd.
U moet het resultaat filteren nadat het is geretourneerd, dus een subquery is vereist. U kunt rang () functie om top-n te krijgen resultaten.

Voor prestaties Probeer het gebruik van NOT EXISTSin plaats van NOT IN. Zie dit voor meer.


Antwoord 2, Autoriteit 38%

Gebruik:

als u Oracle 12C gebruikt

Volgende n alleen rijen

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

Meer info: http://docs.oracle.com/javadb /10.5.3.0/ref/rrefsqljoffsetfetch.html


Antwoord 3, Autoriteit 13%

Probeer

SELECT * FROM users FETCH NEXT 10 ROWS ONLY;

Antwoord 4, Autoriteit 10%

Met betrekking tot de slechte prestaties zijn er een aantal dingen die het zou kunnen zijn, en het zou echt een afzonderlijke vraag moeten zijn. Er is echter een voor de hand liggend ding dat een probleem zou kunnen zijn:

WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

Als History_Date echt een datumkolom is en als het een index heeft, zal deze herschrijving beter presteren:

WHERE HISTORY_DATE = TO_DATE ('06.02.2009', 'DD.MM.YYYY')  

Dit komt omdat een datatype-conversie het gebruik van een B-Tree-index uitschakelt.


Antwoord 5, Autoriteit 5%

U krijgt een schijnbaar willekeurige set omdat Rownum vóór de bestelling wordt toegepast. Uw vraag neemt dus de eerste tien rijen en sorteert ze.0 Om de top tien salarissen te selecteren, moet u een analytische functie in een subquery gebruiken en vervolgens filteren:

select * from 
     (select empno,
             ename,
             sal,
             row_number() over(order by sal desc nulls last) rnm
    from emp) 
 where rnm<=10

Antwoord 6

U kunt deze query gebruiken voor het selecteren van topplaten in Oracle. Rakesh b

Selecteer * van User_Info waar ID & GT; = (selecteer MAX (ID) -10 van User_Info);

Other episodes