webForumDet fria alternativet

Begränsa resultat i Oracle SQL

Databaser & SQLur Databashanterare & SQL

4 svar · 447 visningar · startad av sgtpepper

Medlem sedan apr. 20007 588 inlägg
Frågan#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

Medlem sedan juli 2000325 inlägg
#2

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

Medlem sedan juli 2000325 inlägg
#3

Löste det själv:

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

Medlem 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 :).

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

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