OVH Cloud OVH Cloud

nième enregistrement

5 réponses
Avatar
jpl
Comment retourner en Transact-SQL le ni=E8me enregistrement=20
d'une requ=EAte (pour corser le tout, la table cible=20
comporte une cl=E9 primaire multiple) ?
Merci d'avance pour toute piste de recherche
Jean-Pierre

5 réponses

Avatar
Michel Walsh
Salut,


Une solution est dans le genre:


SELECT TOP 1
FROM (SELECT TOP n *
FROM quelquePart
ORDER BY champ ASC) As a
ORDER BY champ DESC


Une autre méthode est de calculer le rang, dans une table
intermédiare, et d'en sortir l'enregistrement de rang = n. Si la table n'est
pas trop grande:

SELECT a.f1, a.f2, a.f3
FROM maTable As a INNER JOIN maTable as b
ON a.champ <= b.champ
GROUP BY a.f1, a.f2, a.f3
HAVING COUNT(*) = n


où je présuppose que le champ champ n'a pas de doublon. Par opposition à la
première solution, n peut être un paramètre. Si champ peut avoir de
doublons, faire quelque chose du genre:

ON a.champ < b.champ
OR ( a.champ=b.champ AND a.pk <= b.pk)


et de même si pk peut avoir un doublon:

ON a.champ < b.champ
OR ( a.champ=b.champ AND (a.pk < b.pk
OR (a.pk=b.pk AND a.pk2 <= b.pk2)))

et ainsi de suite.





Espérant être utile,
Vanderghast, Access MVP




"jpl" wrote in message
news:a12901c3eb42$5d363b70$
Comment retourner en Transact-SQL le nième enregistrement
d'une requête (pour corser le tout, la table cible
comporte une clé primaire multiple) ?
Merci d'avance pour toute piste de recherche
Jean-Pierre
Avatar
jpl
Merci pour la réponse, mais elle ne correspond pas à ma
recherche : le problème est que ma table possède une clé
primaire composée de deux champs dans lesquels on trouve
des doublons, mais dont l'intersection est unique.

-----Message d'origine-----
Salut,


Une solution est dans le genre:


SELECT TOP 1
FROM (SELECT TOP n *
FROM quelquePart
ORDER BY champ ASC) As a
ORDER BY champ DESC


Une autre méthode est de calculer le rang, dans


une table
intermédiare, et d'en sortir l'enregistrement de rang =


n. Si la table n'est
pas trop grande:

SELECT a.f1, a.f2, a.f3
FROM maTable As a INNER JOIN maTable as b
ON a.champ <= b.champ
GROUP BY a.f1, a.f2, a.f3
HAVING COUNT(*) = n


où je présuppose que le champ champ n'a pas de doublon.


Par opposition à la
première solution, n peut être un paramètre. Si champ


peut avoir de
doublons, faire quelque chose du genre:

ON a.champ < b.champ
OR ( a.champ=b.champ AND a.pk <= b.pk)


et de même si pk peut avoir un doublon:

ON a.champ < b.champ
OR ( a.champ=b.champ AND (a.pk < b.pk
OR (a.pk=b.pk AND a.pk2 <= b.pk2)))

et ainsi de suite.





Espérant être utile,
Vanderghast, Access MVP




"jpl" wrote in


message
news:a12901c3eb42$5d363b70$
Comment retourner en Transact-SQL le nième enregistrement
d'une requête (pour corser le tout, la table cible
comporte une clé primaire multiple) ?
Merci d'avance pour toute piste de recherche
Jean-Pierre


.



Avatar
Michel Walsh
Salut,


et l'ordonnancement est selon cette clé composée?

SELECT TOP 1 *
FROM (SELECT TOP n *
FROM quelquePart
ORDER BY pk1 ASC, pk2 ASC) As a
ORDER BY pk1 DESC, pk2 DESC



et



SELECT a.pk1, a.pk2, a.f3
FROM maTable As a INNER JOIN maTable as b
ON a.pk1< b.pk1 OR ( a.pk1=b.pk1 AND a.pk2<=b.pk2)
GROUP BY a.pk1, a.pk2, a.f3
HAVING COUNT(*) = n




Vanderghast, Access MVP


"jpl" wrote in message
news:a3f901c3eb67$a12fd050$
Merci pour la réponse, mais elle ne correspond pas à ma
recherche : le problème est que ma table possède une clé
primaire composée de deux champs dans lesquels on trouve
des doublons, mais dont l'intersection est unique.

-----Message d'origine-----
Salut,


Une solution est dans le genre:


SELECT TOP 1
FROM (SELECT TOP n *
FROM quelquePart
ORDER BY champ ASC) As a
ORDER BY champ DESC


Une autre méthode est de calculer le rang, dans


une table
intermédiare, et d'en sortir l'enregistrement de rang n. Si la table n'est
pas trop grande:

SELECT a.f1, a.f2, a.f3
FROM maTable As a INNER JOIN maTable as b
ON a.champ <= b.champ
GROUP BY a.f1, a.f2, a.f3
HAVING COUNT(*) = n


où je présuppose que le champ champ n'a pas de doublon.


Par opposition à la
première solution, n peut être un paramètre. Si champ


peut avoir de
doublons, faire quelque chose du genre:

ON a.champ < b.champ
OR ( a.champ=b.champ AND a.pk <= b.pk)


et de même si pk peut avoir un doublon:

ON a.champ < b.champ
OR ( a.champ=b.champ AND (a.pk < b.pk
OR (a.pk=b.pk AND a.pk2 <= b.pk2)))

et ainsi de suite.





Espérant être utile,
Vanderghast, Access MVP




"jpl" wrote in


message
news:a12901c3eb42$5d363b70$
Comment retourner en Transact-SQL le nième enregistrement
d'une requête (pour corser le tout, la table cible
comporte une clé primaire multiple) ?
Merci d'avance pour toute piste de recherche
Jean-Pierre


.



Avatar
Med Bouchenafa[MVP]
Voici un exemple sur la base pubs
SELECT * FROM
(
SELECT rang=count(*), A.au_fname
FROM authors A INNER JOIN authors B ON A.au_fname >= B.au_fname
GROUP BY.au_fname
)t
WHERE t.rang =3

Voir aussi l'article suivant
http://support.microsoft.com/?id6133

--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris

"jpl" wrote in message
news:a12901c3eb42$5d363b70$
Comment retourner en Transact-SQL le nième enregistrement
d'une requête (pour corser le tout, la table cible
comporte une clé primaire multiple) ?
Merci d'avance pour toute piste de recherche
Jean-Pierre
Avatar
jpl
Merci pour la piste de travail ! En reprenant l'idée et
aussi en reconstruisant une clé primaire unique par
concaténation de mes deux clés primaires, je suis arrivé à
mon objectif.
-----Message d'origine-----
Salut,


et l'ordonnancement est selon cette clé composée?

SELECT TOP 1 *
FROM (SELECT TOP n *
FROM quelquePart
ORDER BY pk1 ASC, pk2 ASC) As a
ORDER BY pk1 DESC, pk2 DESC



et



SELECT a.pk1, a.pk2, a.f3
FROM maTable As a INNER JOIN maTable as b
ON a.pk1< b.pk1 OR ( a.pk1=b.pk1 AND


a.pk2<=b.pk2)
GROUP BY a.pk1, a.pk2, a.f3
HAVING COUNT(*) = n




Vanderghast, Access MVP


"jpl" wrote in


message
news:a3f901c3eb67$a12fd050$
Merci pour la réponse, mais elle ne correspond pas à ma
recherche : le problème est que ma table possède une clé
primaire composée de deux champs dans lesquels on trouve
des doublons, mais dont l'intersection est unique.

-----Message d'origine-----
Salut,


Une solution est dans le genre:


SELECT TOP 1
FROM (SELECT TOP n *
FROM quelquePart
ORDER BY champ ASC) As a
ORDER BY champ DESC


Une autre méthode est de calculer le rang, dans


une table
intermédiare, et d'en sortir l'enregistrement de rang =


n. Si la table n'est
pas trop grande:

SELECT a.f1, a.f2, a.f3
FROM maTable As a INNER JOIN maTable as b
ON a.champ <= b.champ
GROUP BY a.f1, a.f2, a.f3
HAVING COUNT(*) = n


où je présuppose que le champ champ n'a pas de doublon.


Par opposition à la
première solution, n peut être un paramètre. Si champ


peut avoir de
doublons, faire quelque chose du genre:

ON a.champ < b.champ
OR ( a.champ=b.champ AND a.pk <= b.pk)


et de même si pk peut avoir un doublon:

ON a.champ < b.champ
OR ( a.champ=b.champ AND (a.pk < b.pk
OR (a.pk=b.pk AND a.pk2 <= b.pk2)))

et ainsi de suite.





Espérant être utile,
Vanderghast, Access MVP




"jpl" wrote in


message
news:a12901c3eb42$5d363b70$
Comment retourner en Transact-SQL le nième enregistrement
d'une requête (pour corser le tout, la table cible
comporte une clé primaire multiple) ?
Merci d'avance pour toute piste de recherche
Jean-Pierre


.





.