webForumDet fria alternativet

Begränsa resultat i Oracle SQL

4 svar · 447 visningar · startad av sgtpepper

sgtpepperMedlem sedan apr. 20007 588 inlägg
#1

Finns det något sätt att begränsa antal rader i resultatet i Oracle SQL ungefär som LIMIT?

------------------
"Common sense is the collection of prejudices acquired by age 18" - Albert Einstein

skarbrattMedlem sedan juli 2000325 inlägg
#2

Ingen som kommit på en lösning på frågan över....?

skarbrattMedlem sedan juli 2000325 inlägg
#3

Löste det själv:

Man sätter bara
WHERE ROWNUM <= 5 i slutet på SQL frågan

sgtpepperMedlem sedan apr. 20007 588 inlägg
#4

Ja jävlar, här sitter jag och letar svar på ett Oracleproblem och vad får jag då se, jomenvisst, jag hade samma problem redan för två år sedan :).

Jobbigt att de tre stora RDBMS:erna inte kan fungera ungefär likadant så att man som utvecklare kan koncentrera sig på smaskiga Java-algoritmer och inte måste dammsuga nätet efter svar på SQL-frågor :e.

Det jag är ute efter är ett sätt att i Oracle endast hämta t.ex de tio senaste posterna i databasen baserat på ett DATE-fält.

I DB2 skulle jag ha skrivit ungefär så här:
SELECT * FROM foo ORDER BY inserted_date DESC FETCH FIRST 10 ROWS ONLY

I SQL Server är det väl något sådant här:
SELECT TOP 10 * FROM foo ORDER BY inserted_date DESC

Om jag gör så här i Oracle:
SELECT * FROM foo WHERE rownum <= 10 ORDER BY inserted_date DESC
Så kommer det naturligtvis inte att funka enligt någon Murphy-lag om databaser :(. ROWNUM sätts innan ORDER BY utförs och alltså kommer jag endast att få första tio första posterna i databasen, inte de tio med "senast" datum baserat på DATE-kolumnen...

Om jag gör en variant där jag plockar ut alla poster och sorterar dom baserat på datum i en sub-select:

SELECT * FROM (SELECT * FROM foo ORDER BY inserted_date DESC) WHERE rownum <=10

så tror jag att det blir rätt (jag jobbar med en befintlig datamodell och den är ful och konstig så jag vet inte riktigt om det är rätt resultat jag får), nackdelen är dock att det tar flera sekunder att utföra frågan och det funkar inte. Tabellen är på knappt 18 000 poster, kan det vara anledningen till den långa svarstiden?

Har jag missat något, inte förstått något eller kan man göra på något helt annat sätt?

Jippie för företag som kör en "blandad" databasmiljö, lite SQL-server här, lite Oracle där och lite DB2 i mitten. Alltid lika kul :).

LarsGMedlem sedan dec. 200012 464 inlägg
#5

Det finns en standardiserad funktion för detta som stöds av DB2 och Oracle men inte SQL server.

Titta på row_number() i någon lämplig dokumentation nära dig.

132 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)