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 EXISTS
in 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);