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 :

Une requête au lieu de deux


Sujet :

Langage SQL

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut Une requête au lieu de deux
    Salut à tous

    Voilà j'ai la table suivante et je cherche à en extraire toutes les lignes ayant la valeur B pour le champs RefD et toutes les lignes qui dont le champs RefA à la valeur B et la valeur de leur champs RefD est parmi celles ayant la valeur B pour le champs RefD. Si ma table contient:
    RefA ..... RefD
    ..K ........W
    ..Z ....... E
    ..A ........B
    .. C ........ B
    D ........ B
    B ........ C
    B ........ H

    le résultat que j'attend est

    RefA RefD ....
    A...... B
    C ..... B
    D ..... B
    B ..... C


    A l'heure actuelle je fait la deux requêtes
    la première sur ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Table WHERE RefD=B
    Et la seconde sur le résultat de la reqête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Table WHERE RefD=A OR RefD=C OR RefD=D
    J'aimerai savoir s'il est possible de réaliser celà en une seule requête.

  2. #2
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,
    Quand tu écris
    extraire toutes les lignes ayant la valeur B pour le champs RefD et toutes les lignes qui dont le champs RefA à la valeur B et la valeur de leur champs RefD est parmi celles ayant la valeur B pour le champs RefD
    , je pense à la lecture de ton exemple et de ton code que tu voulais écrire:
    extraire toutes les lignes ayant la valeur B pour le champs RefD et toutes les lignes qui dont le champs RefA à la valeur B et la valeur de leur champs RefD est parmi celles n'ayant pas la valeur B pour le champs RefD
    Si tel est le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM TABLE 
    WHERE RefD='B'
    OR (RefA='B' AND RefD<>'B')
    ERE

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Une union est suffisante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM Table WHERE RefD=B
    UNION
    SELECT * FROM Table WHERE RefD IN (A, C, D)

  4. #4
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Une union est suffisante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM Table WHERE RefD=B
    UNION
    SELECT * FROM Table WHERE RefD IN (A, C, D)
    Sauf qu'il n'y a plus de condition sur RefA et qu'il existe des valeurs W,E,H dans RefD... Et que l'objectif c'est de faire une seule requête !

    Et dans le cas de l'UNION autant remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM TABLE WHERE RefD=B
    UNION
    SELECT * FROM TABLE WHERE RefD IN (A, C, D)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE WHERE RefD IN (A, B, C, D)

    ERE

  5. #5
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    Si tel est le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM TABLE 
    WHERE RefD='B'
    OR (RefA='B' AND RefD<>'B')
    ERE
    Non ça ne marche pas car si tu applique cette solution à mon exemple la ligne
    B....H va apparaître or il ne le faut pas

  6. #6
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Une union est suffisante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM Table WHERE RefD=B
    UNION
    SELECT * FROM Table WHERE RefD IN (A, C, D)
    Sauf que je ne connais pas les valeurs A,C,D à l'avance c'est pour ça que je fais 2 requêtes pour l'instant.

  7. #7
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut Utiliser une sous requete
    Utiliser une sous requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM Table 
    WHERE RefD=B OR (RefA=B AND RefD IN (select RefD from Table where RefD=B))

  8. #8
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par hazamor Voir le message
    Utiliser une sous requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM Table 
    WHERE RefD=B OR (RefA=B AND RefD IN (select RefD from Table where RefD=B))
    Je crois qu'il faut que Gouyon précise EXACTEMENT ce qu'il veut.

    @Hamazor: sauf erreur de ma part ta sous-requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select RefD from Table where RefD=B
    ... renvoie toujours B !

    ERE

  9. #9
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    renvoie toujours B !
    C'est vrai, desolé!
    je croix qu'il veut:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SELECT * FROM TABLE 
    WHERE RefD=B OR (RefA=B AND RefD IN (SELECT RefA FROM TABLE WHERE RefD=B))

    puisqu'il a dit:

    RefA à la valeur B et la valeur de leur champs RefD est parmi celles ayant la valeur B pour le champs RefD

  10. #10
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    Je crois qu'il faut que Gouyon précise EXACTEMENT ce qu'il veut.

    ERE
    Je pensais avoir été clair et j'avais même mis un exemple. Donc je vais donner quelques précisions. C'est pour un wargame la table résume l'ensemble des combats à résoudre. RefA correspond à une unité qui attaque et RefD est la référence de l'unité attaquée. Pour résoudre le combat j'ai choisi de le faire en faisant le tri par les unité qui se défendent. Ainsi dans mon exemple les unités A,C et D attaquent l'unité B et l'unité B riposte en attaquant l'unité C. Le combat entre les unités B et H sera résolu ultérieurement. C'est pour ça que dans un premier temps je vais chercher toutes les unité qui attaquent l'unité B. Et dans un second temps toutes les unités que l'unité B attaque et qui appartiennent au premier ensemble.

    Je vais essayer une variante de la sous requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM TABLE 
    WHERE RefD=B OR (RefA=B AND RefD IN (SELECT RefD FROM TABLE WHERE RefD=B))

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from matable
    where refD = 'B'
       or refD in (select refA from matable where refD = 'B')
    Le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    with matable(refA, refD) as
    (
    select 'K', 'W' union all
    select 'Z', 'E' union all
    select 'A', 'B' union all
    select 'C', 'B' union all
    select 'D', 'B' union all
    select 'B', 'C' union all
    select 'B', 'H'
    )
    select * from matable
    where refD = 'B'
       or refD in (select refA from matable where refD = 'B')
    ************************
    refA	refD
    A	B
    C	B
    D	B
    B	C
    Notez qu'on aurait pu faire un UNION et se passer du OR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where refD in (select 'B' union select refA from matable where refD = 'B')

  12. #12
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from matable
    where refD = 'B'
       or refD in (select refA from matable where refD = 'B')
    Le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    with matable(refA, refD) as
    (
    select 'K', 'W' union all
    select 'Z', 'E' union all
    select 'A', 'B' union all
    select 'C', 'B' union all
    select 'D', 'B' union all
    select 'B', 'C' union all
    select 'B', 'H'
    )
    select * from matable
    where refD = 'B'
       or refD in (select refA from matable where refD = 'B')
    ************************
    refA	refD
    A	B
    C	B
    D	B
    B	C
    Notez qu'on aurait pu faire un UNION et se passer du OR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where refD in (select 'B' union select refA from matable where refD = 'B')
    C'est exactement ça qui fonctionne merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. faire une requête au lieu de N requêtes
    Par Gregory.M dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/08/2011, 20h01
  2. [MySQL] Après une requête globale comment utiliser deux champs
    Par gb76 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/06/2007, 13h46
  3. Une requête, deux tables, fonction COUNT
    Par Nerva dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/04/2006, 15h10
  4. [MySQL] Faire une requête recourant à deux bases de données
    Par bourvil dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 02/04/2006, 15h35
  5. une requête au lieu de deux ?
    Par trangsene dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/11/2005, 12h37

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