--- Posted by Michel Walsh ---
Joindre des séquences contigues
En supposant qu'on possède des séquences From - To, un peu comme suit:
SequenceA ' nom de la table Who, [From],[To] ' nom des champs 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, 76et, en fin d'ouvrage, on s'attend à obtenir le résultat:
A, 1, 1 B, 17, 23 B, 26, 39 C, 1, 1 C, 12, 76On commence alors par une première requête, combinant tous les [From] avec les [To]+1
SELECT Who, [From] As Origine FROM SequenceA UNION ALL SELECT Who, [To]+1 FROM SequenceA;et que l'on sauvegarde comme QUseq.
Puis, 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 ligique est basée sur ce qu'un décompte de 2 nous indique une soudure ( [To]+1 = [From] ); ce compte de deux est possible de par ce qu'on a utilisé UNION ALL, non UNION, dans la première requête.
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", par exemple::
A, 1 A, 2 B, 17 B, 24 B, 26 B, 40 C, 1 C, 77ce 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. Le join interne est requis pour retrancher les séquences "complémentaires", comme dans le cas de
B, 24, 25