Een van de nieuwe functies in PostgreSQL 13 is de SQL-standaard WITH TIES
clausule te gebruiken met LIMIT
— of, zoals de standaard oproept, FETCH FIRST n ROWS
. Dank gaat uit naar Surafel Temesgen als eerste patch-auteur; Tomas Vondra en ondergetekende voor enkele aanvullende codecorrecties; en recensenten Andrew Gierth en Erik Rijkers. Je kunt het commit-bericht lezen.
Stropdassen zijn heel vaak bij het rangschikken van dingen; in een caucusrace kun je bijvoorbeeld veel banden hebben, en je wilt deelnemers zeker niet van hun prijzen beroven! Wat WITH TIES
doet is vrij eenvoudig:het voegt elke volgende rij of rijen toe aan uw resultatenset, als ze gelijk zijn aan de laatste rij die is geretourneerd volgens de LIMIT
clausule, volgens de ORDER BY
clausule.
Als u alleen de twee werknemers met het hoogste salaris wilt, kunt u dit doen:
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
naam | salaris | afdeling |
---|---|---|
Alicia | 1600 | techniek |
Oruga | 1500 | marketing |
Dus sta je te popelen om het salaris van de volgende persoon te weten? Wat als ze overeenkomt met Oruga, en gewoon door puur toeval of pech werd buitengesloten? Dat kan gebeuren, zoals u heel goed weet; en gelukkig, WITH TIES
is er nu om de dag te redden. (Merk op dat we in werkelijkheid niet omgaan met WITH TIES
in de LIMIT
clausule als zodanig. U moet de FETCH FIRST
. gebruiken syntaxis, die door de standaarden verplicht is, om WITH TIES
te kunnen gebruiken .)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
naam | salaris | afdeling |
---|---|---|
Alicia | 1600 | techniek |
Oruga | 1500 | verkoop |
Conejo Blanco | 1500 | marketing |
Daar! White Rabbit had om te worden vermeld, en nu is hij dat.
Een paar opmerkingen voordat je te gek wordt. LIMIT
(of beter gezegd FETCH FIRST
) belooft niet langer precies het aantal rijen dat u opgeeft te retourneren. Je zou twee of twintig extra rijen kunnen krijgen, of 100x zoveel rijen als je vroeg. Dit betekent onder andere dat je moet bijhouden hoeveel rijen je tot nu toe hebt gezien, als je resultaten pagineert. In het bovenstaande heb je drie rijen, dus voor de volgende pagina sla je er zoveel over door de juiste OFFSET
toe te voegen clausule:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
naam | salaris | afdeling |
---|---|---|
Falsa Tortuga | 1400 | marketing |
Duquesa | 1300 | verkoop |
Liebre de Marzo | 1300 | techniek |
We kregen er weer drie in plaats van slechts twee waar we om vroegen. Dus voor de volgende pagina moet je er zes overslaan. Enzovoort. Zorg ervoor dat je genoeg vingerhoeden voor iedereen hebt.
Het andere om in gedachten te houden is dat je ervoor moet zorgen dat je alleen de ORDER BY
. gebruikt clausule die past bij de WITH TIES
clausule; als je bijvoorbeeld de rijen met hetzelfde salaris op naam wilt laten sorteren, moet je een subquery gebruiken. Anders zou het onderscheid in namen de gelijkspel op het salaris oplossen, zodat de volgende rij niet zou worden opgenomen. Bijvoorbeeld:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
Deze functie is er om u te helpen alle rijen met dezelfde waarde weer te geven — u kunt sommige rijen van gelijke waarde niet discrimineren, uitsluitend op basis van de fysieke locatie in de tabel.
Veel plezier met pagineren!