Sekä TOP että OFFSET & FETCH voidaan käyttää rajoita palautettavien rivien määrää. OFFSET ja FETCH voivat palauttaa samanlaiset tulokset alkuun, mutta on eroja, jotka voivat vaikuttaa siihen, kumpi menetelmä on sinulle parhaiten sopiva.
Kaikki tämän oppitunnin esimerkit perustuvat Microsoft SQL Server Management -ohjelmaan Studio ja AdventureWorks2012-tietokanta. Voit aloittaa näiden ilmaisten työkalujen käytön Oppaalla Aloitusopas SQL Serverin avulla.
Mikä on ero TOP- ja OFFSET-tiedostojen välillä & Hae?
Seuraavissa osioissa käsitellään TOP ja OFFSET & FETCH. Luulen, että kun olet lukenut molemmat kohdat, ymmärrät niiden erot. Nämä on myös yhteenveto tämän artikkelin lopussa olevassa taulukossa.
Yläosa
Yläosaa käytetään palauttamaan tietyn määrän rivejä kyselytuloksesta.
TOP-lauseke on ollut käytettävissä jonkin aikaa vanhemmissa SQL-palvelimen versioissa, kuten SQL 2005. TOP ei ole ANSI-yhteensopiva ja sen käyttö on rajoitettu miehekkäästi Microsoftin tuotteisiin, kuten SQL Server ja MS-Access.
TOP-lausetta käytetään SELECT-käskyn sarakeluettelossa, ja sitä voidaan käyttää ORDER BY -toiminnon kanssa tai ilman.
Esimerkiksi kymmenen halvimman tuotteen valitseminen
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
Vaikka ORDER BY -toimintoa ei vaadita, se on paras käytäntö, sillä ilman sitä et voi taata, mitkä rivit palautetaan.
Yksi TOP-tuotteelle ainutlaatuinen kohde on kyky palauttaa prosenttiosuus riveistä. Lauseke
SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
palauttaa 51 parasta tuotetta, joilla on alhaisin StandardCost-hinta (eli 504 riviä x 10% = 50,4 pyöristettynä 51: een).
Voit myös valita tietyn määrän tietueita kyselytuloksen alaosasta. Voit tehdä tämän käyttämällä temppua tilataksesi tietueet laskevassa järjestyksessä seuraavasti:
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC
Pidä mielessä, kun tulokset lajitellaan laskevassa järjestyksessä, suurimmat summat palautetaan ensin. Tämän vuoksi TOP palauttaa tuotteet, joilla on korkeimmat vakiohinnat.
TOP voi olla erittäin hyödyllinen suurissa tuloksissa, koska tuhansien rivien palauttaminen voi vaikuttaa suorituskykyyn. Monissa tapauksissa käyttötarkoitukset selaavat vain tulosten alkuosan.
TOP voi näyttää siteiden arvon – WITH TIES avulla voit näyttää myös muita tietueita, joilla on sama arvo kuin viimeisellä rivillä perustuloksesta.
OFFSET ja FETCH
OFFSET ja FETCH käytetään palauttamaan ikkuna tietueista tulosjoukosta. OFFSET määrittää, kuinka monta riviä ohitetaan tuloksessa, ja FETCH määrittää, kuinka monta riviä siitä eteenpäin palataan tulokseen.
OFFSET ja FETCH otettiin äskettäin käyttöön SQL Server 2012: ssa ja ovat ANSI-yhteensopivia.
Voit käyttää OFFSETia ilman FETCHia, mutta FETCHia ei voi käyttää yksinään. OFFSETia on kuitenkin käytettävä ORDER BY -lausekkeen kanssa. Syy on yksinkertainen, koska OFFSET ja FETCH ovat osa ORDER BY -lauseketta.
Tässä esimerkissä ohitetaan tuloksen kymmenen ensimmäistä riviä ja sitten seuraavat 10 tuloksessa.
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
Voit kopioida TOPista palautetut rivit käyttämällä OFFSET- ja FETCH-toimintoja, jos tulokset on järjestetty. Seuraava lause on sama kuin TOP 10: n palauttaminen:
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
Kun OFFSET-asetus on 0, rivejä ei ohiteta.
Toisin TOP, OFFSET-toiminnolla ei ole sisäänrakennettuja tapoja palauttaa prosenttiosuus riveistä. Voit kuitenkin kääntää omasi laskemalla prosenttiosuuden näin:
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY
Temppu on alakyselyssä. Laskemalla tuloksen rivien lukumäärän voimme sitten saada prosenttiosuuden. Tässä on alakysely. Halutessasi voit suorittaa tämän SQL Server Management Studiossa.
SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product
Kohteita on useita huomata:
- CEILING pyöristää numerot ylöspäin. Esimerkissämme CEILING (50.4) palauttaa arvon 51.0. Tämä jäljittelee TOP: n käyttäytymistä.
- FETCH vaatii kokonaisluvun arvon, joten muunnoksessa käytetään CAST: ää. Siten 51.0: sta tulee 51
Tuloksen 10 viimeisen tietueen palauttamiseksi on kaksi tapaa. Voimme kääntää lajittelujärjestyksen kuten TOP: lle:
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
Tai voimme säilyttää lajittelujärjestyksen ja laskea siirtymän siten, että kaikki rivit viimeiseen asti kymmenen ohitetaan. Tutkimme tätä tekniikkaa yksityiskohtaisemmin SQL-oppitunnissa OFFSET ja FETCH.
Yhteenveto eroista
Tässä on yhteenveto TOPin ja OFFSETin suurimmista eroista & FETCH.
Jos tavoitteenasi on vain palauttaa useita ensimmäisiä rivejä, mielestäni TOP on kuitenkin yksinkertainen ratkaisu; jos etsit sivutusratkaisua tai haluat valita rivejä kyselytulosten keskellä tai alareunassa vaikuttamatta alkuperäiseen lajittelujärjestykseen, luulen, että OFFSET & FETCH ovat parhaita.