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
Libérer: 2025-01-04 19:01:41
original
968 Les gens l'ont consulté

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;
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal