Requête SELECT très complexe

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 - 16 mars 2013 à 19:17
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 - 23 avril 2013 à 15:03
Bonjour,

Je dois faire une requête SELECT complexe et je rencontre un problème. J'espère qu'une bonne âme pourra me filer un coup de main pour délier tout ça car je suis loin d'être un expert en SQL.

Je dois donc sélectionner des lignes qui n'existent pas dans la table. Je vais tenter de faire simple sans vous embrouiller avec la complexité de la structure de la table et de la requête pour aller à l'essentiel du problème.

J'au une Table avec

ID- Clé Primaire)
PAYS - Clé Étrangère
TYPE - (NVARCHAR(50))
MAX - INT
INDICE - INT

Voici un exemple de donnée (je ne vous fait pas les GUID, trop long et beaucoup moins lisible que des index INT...) :

  ID   PAYS    TYPE      MAX    INDICE 
  0  |   2  |  Type1  |   5   |   2
  1  |   2  |  Type2  |   2   |   4
  2  |   1  |  Type1  |   2   |   2
  3  |   1  |  Type2  |   1   |   1

Donc mon problème est que je doit me servir de la colonne max comme d'un multiplicateur. En gros je dois faire une requête SELECT qui pour chaque ligne de la table boucle sur la valeur de MAX et qui multiplie la valeur de la colonne INDICE. C'est dur à expliquer donc voilà un aperçu des données que je devrais obtenir :
  
  ID   PAYS    TYPE     Multi    INDICE 
  0  |   2  |  Type1  |   1    |   2
  0  |   2  |  Type1  |   2    |   4
  0  |   2  |  Type1  |   3    |   6
  0  |   2  |  Type1  |   4    |   8
  0  |   2  |  Type1  |   5    |  10
  1  |   2  |  Type2  |   1    |   4
  1  |   2  |  Type2  |   2    |   8
  2  |   1  |  Type1  |   1    |   2
  2  |   1  |  Type1  |   2    |   4
  3  |   1  |  Type2  |   1    |   1
  3  |   1  |  Type2  |   2    |   2

En gros, les lignes du résultat sont multipliés, on retrouve 5 fois la ligne 1 avec son ID, et l'indice multiplié pour chaque ligne, 2 fois la ligne 2, 2 fois la ligne 3 et une fois la ligne 4. En gros il faut arriver à créer dynamiquement des lignes dans la table retournée par la requête.

j'ai déjà eu à faire ce genre de chose avec les dates pour les statistique d'un graphique, il fallait afficher tous les jours du mois même quand il n'y avait pas d'entrée en base, le graphique affichait alors un point zéro pour le jour. Avec les dates on peut aisément parcourir les jours d'un mois. Mais la je ne vois pas comment faire pour parcourir mon nombre MAX en partant de 1.

Encore une fois, je remercie d'avance ceux qui prendrons de leur temps pour me répondre et si je n'ai pas été clair n'hésitez pas à me demander des précisions.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
A voir également:

12 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 avril 2013 à 10:09
Oui je parle du code cote serveur.
Alors je sais pas exactement ce qui se passe completement dans ton traitement, et je suppose que dans ta requete
SELECT * FROM T1 
WHERE T1.id NOT IN (SELECT...) 
AND T1.id NOT IN (SELECT...)

les "NOT IN SELECT" font des comparaisons avec T1.Multi .
N'y a-t'il pas moyen de faire ta requête plus simplement, quitte à la diviser ?
Ce que j'imagine (en gros, car il doit y avoir des subtilités dans ta requete dont je n'ai pas connaissance), c'est de faire ton select, puis, dans ton code qui traite ces resultats, ne traiter que les lignes qui correspondent à ton critère, en traitant chaque ligne N fois, avec la valeur de multi definie par ta boucle.
2