Vérification mathématique en SQL

Bonjour les jeunes.

Un petit problème qui devrait être intéressant à résoudre

Comment vérifier si dans ma table, j’ai N éléments contenant 2 bornes chacun
que toutes les bornes se suivent 1 à 1.

Si j’ai N éléments je dois avoir une suite de valeurs de 1 à 2N.
Et ceci en SQL :wink:

en gros il faut que je valide une table comme ça

id1 | id2 | champs 1 | 3 | toto 2 | 4 | toto2

mais pas celle ci par exemple

id1 | id2 | champs 1 | 5 | toto 2 | 8 | toto2

id1 | id2 | champs 1 | 5 | toto 2 | 8 | toto2

est ce que tu attendais un 6 à la place du 8 ou même le 5 n’est pas bon pour toi ?

Bonne question en fait le 5 et le 8 ne sont pas bons dans une structure telle que celle ci.

Il y a 2 éléments donc 4 bornes je dois donc avoir la suite 1,2,3,4

Si j’avais une structure avec 12 éléments je dois donc avoir la suite de 1 à 24

donnes moi le tableau à trois éléments pour voir si je te suis

Un exemple de tableau à 3 elements

id1 | id2 | champs 1 | 6 | toto 2 | 3 | toto1 4 | 5 | toto2

Un exemple de tableau à 6 elements

id1 | id2 | champs 1 | 12 | toto 2 | 5 | totoA 3 | 4 | totoB 6 | 11 | totoC 9 | 10 | totoD 7 | 8 | toto2

Donc tous les éléments distincts, positifs et inférieurs à n. Tu peux faire ça: tu prends les éléments, tu les tries (coût en n.ln(n)) et vérifies qu’ils sont entre 1 et n.
Avec SQL ça doit se faire facilement, tu assures le tri en construisant petit à petit une table avec un index (ce qui assurera l’unicité)

Sinon, tu fais un tableau de booléens et tu parcours tes tables en mettant à «true» le ième élément du tableau pour la lecture de i. Ça te donne une complexité en n au lieu de n.ln(n).

Donc tous les éléments distincts, positifs et inférieurs à n. Tout à fait mais il faut qu’ils soient aussi contigue.

si tu fais un de toutes les valeurs de id1 toutes les valeurs de id2, ordre croissant

tu créé une table avec deux champs, un champ INT <auto increment - primary key>, et un champ INT pour y mettre tes valeurs

tu réinitialise la table en question, afin que le auto incrément recommence à la plus petite valeur issue de ton select (car je ne sais pas si ça sera toujours 1)

tu insère les valeurs de ton select dans la table en question, et surtout dans l’ordre.

normalement, sur chaque ligne, les deux colonnes doivent être identiques.

Eh bien, tu as n lignes, tu fais un tablea de longueur 2N initialisé à false, puis pour toutes valeurs sur chaque ligne:

Pour chaque i Si i<= 0 ou i > 2*n alors valeur hors cadre Si V.(i) alors 2 valeurs identiques Sinon V.(i)<-True
Comme tu as entré 2n valeurs distinctes entre 1 et 2n, elles y sont toutes.

Ben en fait j’ai pas tout saisi à l’explication :smiley: je suis sûr qu’elle est pertinente mais j’y comprend rien?

Essaye de prendre 10 entiers distincts compris entre 1 et 10 qui ne soient pas {1,2,3,4,5,6,7,8,9,10}… Tu ne peux pas, donc si ils sont 10, différents 2à2 et compris entre 1 et 10, ils sont 1,2,3,4,5,6,7,8,9,10

Ashgenesis, des news la dessus ?

Pas encore eu le temps de me pencher sur le code SQL pour mettre en pratique les solutions évoquées. Mais c’est prévu :wink: