Toute réponse qui se joint à une table sur elle-même va créer une loi carrée ...
- a JOIN b ON a.class = b.class AND a.age >= b.age
- on average the >= condition will be true for half the class
- 6 people in a class
->6*6/2 = 18
- 10 people in a class
->10*10/2 = 50
-> very rapid growth
Comme les tailles de table poussent la performance se dégrade rapidement. Si vous gardez les choses petites et qu'elles ne grandiront pas beaucoup, est-ce un problème? Votre appel ... il
Une alternative implique plus de code, mais croît linéairement ...
- Tout d'abord, insérez tous les enregistrements intoa nouvelle table, avec un champ d'identité, classés par ordre de classe alors l'âge
- maintenant, pour chaque classe, trouver le MIN (id)
- maintenant, pour chaque classe, RINF le dossier où est = MIN (id) + 8 (pour le 9 aîné)
Il y a beaucoup des façons de faire les 2 dernières étapes. J'utiliserais personnellement ...
SELECT
[USER_WITH_IDS].id,
[USER_WITH_IDS].class,
[USER_WITH_IDS].age
FROM
[USER_WITH_IDS]
WHERE
[USER_WITH_IDS].id = (
SELECT
MIN([min].ID) + 8
FROM
[USER_WITH_IDS] AS [min]
WHERE
[min].class = [USER_WITH_IDS].class
)
Ce que cela donne est ...
- Un laissez-passer pour créer les nouveaux ID
- Un laissez-passer pour obtenir le MIN (id) pour chaque classe
Un laissez-passer pour obtenir les dossiers dont vous avez besoin
Et selon la façon dont bon l'optimiseur est, en utilisant un index (classe puis id) lui permettrait de combiner les 2 dernières passes en 1 passe.
2 ou 3 passes, quelle que soit la taille de la table ou de la classe. Linéaire, pas la loi carrée ...
La méthode dans le lien ne fonctionne pas mais il est un peu un hack. C'est aussi très rapide. Pour un offs bien, pour la production non! –