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

Requêtes et SQL. Discussion :

Requete SQL avec condition [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Requete SQL avec condition
    Bonjour a tous,
    Petite requete simple mais je ne m'em sors pas trop...y'a une logique qui m'échappe.

    Je voudrais avec la syntaxe pour ce type de requête (avec un select * from ...Left JOIN ON)

    SI variable de table a = variable de table b
    effectuer la jointure selon les critères suivant......(bla bla bla)
    Mais SI variable de la table b is Null
    alors effectuer la jointure selon les critères suivants.....(bla bla bla)

    En fait pour être plus pragmatique :

    J'ai 2 tables avec dans la table 1 : A1 B1 C1 et dans ma table 2 : A2 B2 C2
    Je veux joindre ma table A1 a A2, mais la variable A2 n'est pas remplie de façon systématique
    donc je voudrais faire jointure quand A1 = A2 and B1 = B2 and C1=C2 mais aussi lorsque A2 n'a pas de valeur (NULL) faire la jointure sur uniquement B1=B2 et C1=C2.

    si variable A2 existe prendre variable A1 si elle n'existe pas ne prendre que les variables Bx et Cx.

    j'espère avoir été le plus clair possible...ce que je ne pense pas.

    Merci a vous d'avance///

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Je pense qu'il serait mieux de faire ça au niveau de WHERE en enlevant la jointure...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ... FROM T1, T2 WHERE (A1=A2 AND B1=B2 AND C1=C2) OR (A2 IS NULL AND B1=B2 AND C1=C2) 
    UNION
    SELECT ... FROM  T1 WHERE A1 & B1 & C1 NOT IN (SELECT A2 & B2 & C2 FROM T2)
    @+

  3. #3
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    Salut
    Je pense qu'il serait mieux de faire ça au niveau de WHERE en enlevant la jointure...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ... FROM T1, T2 WHERE (A1=A2 AND B1=B2 AND C1=C2) OR (A2 IS NULL AND B1=B2 AND C1=C2) 
    UNION
    SELECT ... FROM  T1 WHERE A1 & B1 & C1 NOT IN (SELECT A2 & B2 & C2 FROM T2)
    @+
    Houllala !!!!!!!!!

    @alassanediakite, Jointures, Jointures.....

    Bonne journée,
    Cordialement

  4. #4
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour cette réponse mais je n'arrive pas a mes fins avec la solution proposée. Chtulus...Une idée peut-être (surement)..

    Merci a vous

  5. #5
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    En pièce jointe mon exemple.
    S'il existe une solution en jointure je la mets dans mes notes sur SQL.
    @+
    Fichiers attachés Fichiers attachés

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    sauf erreur de compréhension du problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [FONT=Courier New]SELECT t1.*,
    t2.*
    FROM t1
    INNER JOIN t2
    ON ( t1.b1 = t2.b2 )
    AND ( t1.c1 = t2.c2 )
    WHERE ( t2.a2 IS NULL
    OR t2.a2 = t1.a1 )[/FONT]
    @+

    Philippe

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    ou alors, s'il faut privilégier les liaisons non nulles si elles existent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT t1.*, t2.*
    FROM t1 INNER JOIN t2 ON ( t1.c1 = t2.c2 ) AND ( t1.b1 = t2.b2 )
    WHERE (t2.a2 = t1.a1 OR (SELECT MIN(a2) FROM t2 T WHERE T.b2=t2.b2 AND T.c2=t2.c2) IS NULL);
    Philippe

  8. #8
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    philiben
    J'en prends leçon
    Je retiens surtout qu'il faut reformuler une question pour trouver une solution plus simple.

  9. #9
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Philben,


    ou alors, s'il faut privilégier les liaisons non nulles si elles existent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.*, t2.*
    FROM t1 INNER JOIN t2 ON ( t1.c1 = t2.c2 ) AND ( t1.b1 = t2.b2 )
    WHERE (t2.a2 = t1.a1 OR (SELECT MIN(a2) FROM t2 T WHERE T.b2=t2.b2 AND T.c2=t2.c2) IS NULL);
    Et bien merci c'est exactement ce que je cherchais.

    Merci beaucoup.

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour

    Pardon en fait je ne comprends pas trop le "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MIN(a2) FROM t2 T
    ".
    Auriez vous la gentillesse de m'expliquer cette recherche de min dams T2.

    Merci encore

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    Pardon en fait je ne comprends pas trop le
    En faite, la sous-requête retourne le minimum des valeurs a2 de la table t2 (aliasée en t par <FROM t2 t>, on aurait pu écrire <FROM t2 AS t>). La clause Where de cette sous-requête filtre avant les données sur b2 et c2.

    La fonction d'aggrégat Min(a2) (avec Max(a2), ça fonctionne pareil!) retournera NULL si aucune valeur a2 n'existe dans la table t2 pour les valeurs b2 et c2.
    Si la valeur retournée est NULL on accepte de sélectionner les lignes courantes de t1 et t2 liées par la clause INNER JOIN.

    @+

    Philippe

  12. #12
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Philben,

    Et bien un grand merci pour cette solution et toutes ces explications.

    Merci encore.

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

Discussions similaires

  1. [AC-2010] requete sql avec condition de dates
    Par Gerard.chery dans le forum VBA Access
    Réponses: 8
    Dernier message: 03/02/2014, 15h44
  2. [MySQL] Requete SQL avec 2 tables et condition de date+somme
    Par lounou dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/11/2012, 17h43
  3. requete sql avec une condition dans une zone de liste
    Par khilim1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/12/2008, 12h00
  4. [Access] requete sql avec condition sur date
    Par qeja dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/03/2006, 23h54
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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