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 :

Tester si un couple de champs existe sur une autre table


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Tester si un couple de champs existe sur une autre table
    Bonjour à tous,

    Sous Access, je cherche à créer une requête SQL qui me permet de faire un update pour les lignes qui ont 2 champs à la fois présents dans une autre table.

    voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE Table1
    SET commentaire='PRESENT'
    WHERE (Nom, Prenom) IN (
        SELECT (Nom, Prenom) FROM TABLE2
        WHERE ... )
    Mais voilà, les couples entre parenthèses ne fonctionnent pas sous access.
    Je n'ai pas envie de passer par des concatenations de chaînes de caractère, car c'est trop long.

    Y-a-t-il une autre solution ?

    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    ça marche ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE Table1
    SET commentaire='PRESENT
    FROM (SELECT ...) S, Table1 t'
    WHERE t.Nom = S.Nom and t.Prenom=S.Prenom

  3. #3
    Membre chevronné

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par jerjerrod
    Je n'ai pas envie de passer par des concatenations de chaînes de caractère, car c'est trop long
    Et surtout ça n'est pas une méthode fiable si la longueur de chaque élément concaténé est variable ; exemple :
    nom ; prenom ; concaténation
    AA ; BB ; AABB
    A ; ABB ; AABB

    Ici le résultat de la concaténation est identique mais les données sources sont bien différentes.
    Une solution consisterait à passer par une sous-requête corrélée avec NOT EXISTS et une jointure sur nom ET sur prénom.

    Avez-vous testé ?
    [edit]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE TABLE1 T1
    SET    T1.COMMENTAIRE = 'PRESENT'
    WHERE  EXISTS (SELECT *
                   FROM   T2
                   WHERE  T1.NOM = T2.NOM
                          AND T1.PRENOM = T2.PRENOM
    [...])
    [/edit]

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour cette solution !
    Ma requête est un peu lente là, donc il faudra attendre un peu avant de savoir si elle me donne les bons résultats.

    Mais je ne doute pas sur son bon fonctionnement.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Citation Envoyé par jerjerrod
    Ma requête est un peu lente là, donc il faudra attendre un peu avant de savoir si elle me donne les bons résultats.
    Est-ce que cela améliore les temps de réponse ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE TABLE1 T1
    SET    T1.COMMENTAIRE = 'PRESENT'
    WHERE EXISTS (SELECT 1
                   FROM   T2
                   WHERE  T1.NOM = T2.NOM
                          AND T1.PRENOM = T2.PRENOM
    [...])
    Sinon, les colonnes NOM et PRENOM sont-elles indexées ?

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    J'utilise en ce moment la requête avec la sous requete correlée.

    Il faut savoir qu'en réalité j'ai une triplette de 3 champs qui correspondent à ma clé que je dois tester sur ma 2eme table, que je travaille en réseau depuis un portable, et qu'il n'y a pas d'index sur ces 3 champs.
    Ce n'est pas moi qui contrôle la base, mais si c'est absolument nécessaire je demanderai à le faire faire.
    Je vais attendre un peu avant de mettre le 1 à la place de *.

    Donc c'est un peu normal que ce soit lent.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/08/2014, 12h02
  2. Réponses: 4
    Dernier message: 08/06/2011, 15h43
  3. Réponses: 11
    Dernier message: 08/01/2008, 12h36
  4. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 23h58
  5. Réponses: 3
    Dernier message: 09/07/2004, 11h23

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