Maison >base de données >tutoriel mysql >Comment simuler le TOP n WITH TIES de SQL Server dans PostgreSQL ?

Comment simuler le TOP n WITH TIES de SQL Server dans PostgreSQL ?

DDD
DDDoriginal
2025-01-04 19:01:411034parcourir

How to Simulate SQL Server's TOP n WITH TIES in PostgreSQL?

Équivalent PostgreSQL pour TOP n AVEC TIES : LIMIT "avec liens"

PostgreSQL n'offre pas d'équivalent direct au TOP n AVEC de SQL Server Clause TIES. La clause LIMIT dans PostgreSQL est utilisée pour spécifier le nombre de lignes à renvoyer, mais elle n'inclut pas les liens.

Approche alternative utilisant des expressions de table communes (CTE)

Dans les versions de PostgreSQL jusqu'à 12, une approche alternative consiste à utiliser une expression de table commune (CTE) avec une fonction de classement pour simuler l'expression AVEC TIES. behavior :

WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

Ici, Rank() attribue un classement à chaque ligne en fonction de la clause ORDER BY. La comparaison <= dans la clause WHERE garantit que toutes les lignes dont le rang est inférieur ou égal à n sont sélectionnées, y compris les égalités.

Alternatives plus rapides pour les grandes tables dans PostgreSQL 12 ou version antérieure

Pour les grandes tables, une approche alternative plus rapide que la méthode CTE est proposée ici :

[Équivalent à FETCH FIRST WITH TIES dans Postgres 11 avec des performances comparables](https://www.db-fiddle.com/f/h6i8rtyv234ucf653j9k8x46q/0)

PostgreSQL 13 et Au-delà

Depuis PostgreSQL 13, la clause WITH TIES a été officiellement ajoutée. Cette clause peut être utilisée directement avec la clause LIMIT pour obtenir le comportement souhaité :

SELECT *
FROM   tablename
ORDER BY nums DESC
LIMIT 3 WITH TIES;

Cela renverra {10, 9, 8, 8}, comme vous le souhaitez, en prenant les 3 premières lignes et en incluant les 8 rangées supplémentaires à égalité avec la troisième rangée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn