IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Valeur commune à plusieurs requêtes


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 67
    Points : 44
    Points
    44
    Par défaut Valeur commune à plusieurs requêtes
    Bonjour,
    Je ne sais pas si le titre est assez explicite, je vois pas trop comment décrire mon problème.

    Je vous explique le contexte. J'ai deux tables, la première représente des codes de tension avec leur référence. La deuxième table représente les valeurs de tensions associées à un code tension, les valeurs peuvent être de plusieurs type (sous tension, tensions nominale, sur tensions, tension de démarrage...). Voici le schéma des deux tables :
    Nom : voltage.png
Affichages : 298
Taille : 7,0 Ko

    Ce que je voudrais réussir à faire, c'est à partir de trois couples (par exemple) value et voltageValueType récupérer le code tension associé via voltage de VoltageValue. En gros en faisant 3 requêtes avec chacune un couple, j'aimerai à partir de ces trois requêtes récupérer la valeur commune de la colonne voltage qui me permettra de récupérer le bon code tension.

    exemple : je voudrai récupérer le code tension de référence FZ à partir des tensions de valeurs et type 198 => UN_A(sous tension), 230 => UN(tension nominale), 253 => UN_B(sur tension)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from VoltageValue
    where value = 198 and voltageValueType = 'UN_A';
     
    select * from VoltageValue
    where value = 230 and voltageValueType = 'UN';
     
    select * from VoltageValue
    where value = 253 and voltageValueType = 'UN_B';
    Résultat des requêtes :
    query 1 :
    Nom : query1.png
Affichages : 329
Taille : 3,0 Ko
    query 2 :
    Nom : query2.png
Affichages : 301
Taille : 4,2 Ko
    query 3 :
    Nom : query3.png
Affichages : 299
Taille : 4,4 Ko

    Il faudrait donc que je récupère le code tension d'identifiant 2 car il est commun aux trois requeêtes.

    J'espère que j'ai été clair, j'avoue que je bloque pas mal sur l'élaboration de la requête.
    Si vous avez des pistes à me soumettre je vous remercie.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si j'ai bien compris, vous voulez extraire les lignes qui ont à la fois des valeurs 198 et 230 et 253, et des valeur types UN et UN_A et UN_B et ayant une valeur de voltage commune
    Auquel cas, vous pouvez faire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Col1, Col2..., Coln
    FROM VoltageValue VV1
    inner join VoltageValue VV2
       on VV2.voltage = VV1.voltage
    inner join VoltageValue VV3
       on VV3.voltage = VV1.voltage
    where VV1.value = 198
      and VV1.voltageValueType ='UN_A'
      and VV2.value = 230
      and VV2.voltageValueType ='UN'
      and VV3.value = 253
      and VV3.voltageValueType ='UN_B'
    Attention :
    - s'il les colonnes voltage, voltagevalue et value ne sont pas indexées et que vos tables sont volumineuses, les perfs seront mauvaises, envisagez l'ajout d index en ce cas
    - vous utilisez des noms réservés comme nom de colonne (value), c'est une mauvaise idée, ça oblige à mettre des quotes dans les requêtes ce qui est peu pratique

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 870
    Points
    12 870
    Par défaut
    Bonjour,
    Tu peux passer par un regroupement, compter le nombre de lignes et restreindre le résultat sur ce nombre.
    De cette façon:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select col1,col2,col3,count(*)
    from Matable
    Where (colx = 1 and coly = 2) or (colx = 3 and coly = 7) or (colx = 12 and coly = 123)
    group by col1,col2,col3
    having count(*) = 3

    Par contre ça ne fonctionne pas avec un select *

    Tatayo.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Je suis surpris de voir votre colonne "voltage" définie en bigint !
    vous devez stocker de telles grandeurs pour que de l'integer n'y suffise pas ?
    De plus vous n'avez aucune unité de mesure, c'est toujours dangereux. Comment savoir que toutes les mesures sont dans la même unité, et de quelle unité il s'agit ?

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 67
    Points : 44
    Points
    44
    Par défaut
    Merci pour votre retour.

    J'ai repris ta requête tatayo et elle fonctionne très bien je t'en remercie

    Je suis surpris de voir votre colonne "voltage" définie en bigint !
    vous devez stocker de telles grandeurs pour que de l'integer n'y suffise pas ?
    De plus vous n'avez aucune unité de mesure, c'est toujours dangereux. Comment savoir que toutes les mesures sont dans la même unité, et de quelle unité il s'agit ?
    Alors en effet, et c'est la même chose pour toutes les tables de ma base, tout les identifiants sont en BIGINT. A la reflexion, c'est vrai que je n'ai pas besoins de stocker de si grandes valeurs dans ma base, je pense que c'est un mauvais choix de conception.
    Pour les unités de mesures, j'ai bien une table qui répertorie toutes les unités de mesures qui sont utilisées par l'application mais je ne l'ai pas reliée a la table voltage.

Discussions similaires

  1. Trouver une valeur commune à plusieurs enregistrements
    Par chezgligli dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/09/2011, 08h30
  2. [WD16] Remplissage fichier avec valeurs de plusieurs requête
    Par JustineJ dans le forum WinDev
    Réponses: 7
    Dernier message: 11/08/2011, 10h18
  3. [WD16] Plusieurs valeurs dans une requête
    Par jujurochedu42 dans le forum WinDev
    Réponses: 3
    Dernier message: 24/05/2011, 11h14
  4. combo box afficher plusieurs valeurs d'une requête
    Par Cupidon dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/10/2008, 17h10
  5. Réponses: 1
    Dernier message: 13/03/2007, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo