En supposant qu'on possède des séquences From - To, un peu comme suit:
SequenceA
Who, [From],[To]
A, 1, 1
B, 17, 20
B, 21, 23
B, 26, 29
B, 30, 34
B, 35, 39
C, 1, 11
C, 12, 12
C, 13, 45
C, 46, 49
C, 50, 76
et, en fin d'ouvrage, on s'attend à obtenir le résultat:
A, 1, 1
B, 17, 23
B, 26, 39
C, 1, 76
On peut alors commencer par une première requête, combinant tous les [From] avec
les valeurs [To] augmentées de +1
SELECT Who, [From] As Origine
FROM SequenceA
UNION ALL
SELECT Who, [To]+1
FROM SequenceA;
et que l'on sauvegarde comme QUseq.
Puis, on effectue une seconde requête avec laquelle on décompte le nombre d'apparition
de chaque nombre:
SELECT QUseq.Who, QUseq.Origine
FROM QUseq
GROUP BY QUseq.Who, QUseq.Origine
HAVING (((Count(QUseq.Origine))<>2))
ORDER BY QUseq.Who, QUseq.Origine;
et que nous sauvegardons sous le nom de QUseq1. La logique est basée sur ce
qu'un décompte de 2 nous indique une soudure (un [To]+1 est égal à un [From] d'un autre enregistrement); ce compte de deux est possible de par ce qu'on a utilisé UNION ALL, non UNION, dans la
première requête. En effet, un UNION simple enlève les duplicats, et un compte de deux ne se serait jamais produit si on n'avait pas utilisé le descripteur ALL.
La requête ne nous retourne que les nombres n'ayant pas un décompte de
deux, la requête nous retourne donc toutes les nouvelles "limites", les nombres qui ne se sont pas "soudés", par
exemple::
A, 1
A, 2
B, 17
B, 24
B, 26
B, 40
C, 1
C, 77
ce qui deviendra le résultat escompté:
A, 1, 1
B, 17, 23
B, 26, 39
C, 1, 76
à l'aide d'une traduction par une dernière requête:
SELECT QUseq1.Who, QUseq1.Origine, DMin("Origine","QUseq1","Who='" &
[Quseq1].[Who] & "' AND Origine >" & [Origine])-1 AS Expr1
FROM QUseq1 INNER JOIN SequenceA ON (QUseq1.Origine = SequenceA.From) AND
(QUseq1.Who = SequenceA.Who);
où l'utilisation de DMin()-1 défait notre travail initial sur [To]+1. La
jointure interne est requis pour retrancher les séquences "complémentaires",
comme dans le cas de
B, 24, 25