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 :

DELETE de plusieurs enregistrements dans une table avec plusieurs clés primaires


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut DELETE de plusieurs enregistrements dans une table avec plusieurs clés primaires
    Bonjour,

    Je tourne en rond depuis un moment sur un problème qui a déjà dû être résolé 20 fois, mais je ne trouve nulle part comment...

    J'ai une table MaTable1 avec 3 clés primaires id1, id2, id3.
    J'ai une table MaTable2 avec 4 clés primaires id1, id2, id3 et id4 (id1, id2 et id3 sont aussi des clés étrangères vers MaTable1. Me demandez pas pour quoi ne pas mettre un id unique dans cette table et 3 clés étrangères, je n'y suis pour rien ^^ mais ça change pas grand chose au problème.).

    Je cherche à supprimer de MaTable1 tous les enregistrements qui ne sont pas dans MaTable2.

    Comment faire ça en une seule requête ? Je pensais à un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE FROM MaTable1
    WHERE (id1, id2, id3) IN (
      SELECT DISTINCT T1.id1, T1.id2, T1.id3
      FROM MaTable1 T1
        LEFT OUTER JOIN MaTable2 T2
          ON (T1.id1 = T2.id1)
          AND (T1.id2 = T2.id2)
          AND (T1.id3 = T2.id3)
      WHERE (T2.id4 IS NULL)
      )
    La requête suivante marche très bien et me renvoie les bons enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT T1.id1, T1.id2, T1.id3
    FROM MaTable1 T1
      LEFT OUTER JOIN MaTable2 T2
        ON (T1.id1 = T2.id1)
        AND (T1.id2 = T2.id2)
        AND (T1.id3 = T2.id3)
    WHERE (T2.id4 IS NULL)
    Mais quand je l'intègre à l'autre, SQL Server me balance l'exception :
    Expression de type non booléen spécifiée dans un contexte où une condition est attendue, près de ','.
    Je crois qu'il n'aime pas le IN sur plusieurs champs...

    J'ai raté quelque chose ou c'est pas possible de faire comme ça ?

  2. #2
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Bon bah j'ai trouvé tout seul du coup...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM MaTable1
    WHERE NOT EXISTS (
      SELECT T2.id4
      FROM MaTable2 T2
      WHERE (T2.id1 = MaTable1.id1)
        AND (T2.id2 = MaTable1.id2)
        AND (T2.id3 = MaTable1.id3)
    )
    Je comprends pas trop comment le SGBD se débrouille avec ça mais ça marche...

  3. #3
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par madmox Voir le message
    Bonjour,
    J'ai une table MaTable1 avec 3 clés primaires id1, id2, id3.
    J'ai une table MaTable2 avec 4 clés primaires id1, id2, id3 et id4 (id1, id2 et id3 sont aussi des clés étrangères vers MaTable1.
    Ce n'est pas très claire.
    MaTable2 avec 3 clés étrangères (id1, id2, id3) et id4 clé primaire de MaTable2 ?

    Bon je suppose que :

    MaTable1 = table ENFANT
    MaTable2 = table PARENT


    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
     
    BEGIN TRANSACTION
    --Delete de la table ENFANT (MaTable1)
    DELETE FROM MaTable1
    WHERE EXISTS (
      SELECT DISTINCT T1.id1, T1.id2, T1.id3
      FROM MaTable1 T1
        LEFT OUTER JOIN MaTable2 T2
          ON (T1.id1 = T2.id1)
          AND (T1.id2 = T2.id2)
          AND (T1.id3 = T2.id3)
      WHERE (T2.id4 IS NULL)
      )
     
     --Delete de la table PARENT (MaTable2)
     DELETE FROM MaTable2 T2
     WHERE T2.id4  IS NULL
     
    COMMIT
    Pour plus de détails lis ceci

    A+

  4. #4
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par madmox Voir le message
    Bon bah j'ai trouvé tout seul du coup...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM MaTable1
    WHERE NOT EXISTS (
      SELECT T2.id4
      FROM MaTable2 T2
      WHERE (T2.id1 = MaTable1.id1)
        AND (T2.id2 = MaTable1.id2)
        AND (T2.id3 = MaTable1.id3)
    )
    Je comprends pas trop comment le SGBD se débrouille avec ça mais ça marche...
    Il me semble que au début de ton post tu avais mis la clause
    WHERE (T2.id4 IS NULL)
    cette clause n'apparaît pas dans la solution que tu as trouvé.

  5. #5
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Elle n'apparait pas textuellement mais le résultat est le même, id4 est une clé primaire de MaTable2 et ne peut pas être NULL. Donc ce critère (id4 IS NULL) est uniquement vérifié lorsque la jointure externe sur MaTable2 renvoie NULL et donc que la clause NOT EXISTS de ma requête n°2 (celle qui marche) est vraie.

    Sinon :
    Ce n'est pas très claire.
    MaTable2 avec 3 clés étrangères (id1, id2, id3) et id4 clé primaire de MaTable2 ?

    Bon je suppose que :

    MaTable1 = table ENFANT
    MaTable2 = table PARENT
    C'est plutôt l'inverse, les clés étrangères sont dans MaTable2 donc c'est elle la table enfant ^^
    Et non, les clés id1, id2 et id3 sont aussi définies en tant que clés primaires de MaTable2 dans ma base (mais je n'y suis pour rien...).

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    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 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Citation Envoyé par madmox Voir le message
    Et non, les clés id1, id2 et id3 sont aussi définies en tant que clés primaires de MaTable2 dans ma base (mais je n'y suis pour rien...).
    C'est bizarre, j'ai toujours cru qu'on ne pouvait avoir qu'une seule clé primaire par table...

    Tatayo.

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Vous connaissez pas les clés primaires composites ? C'est sûr qu'en mettre une seule simplifie pas mal certaines requêtes, mais dans certains cas c'est pas évident de faire sans, voire c'est beaucoup plus pratique qu'un simple id.

    Exemple : Clés primaires composites

    Enfin si c'était pour jouer sur les mots, oui une clé primaire même composite est unique pour une table, c'est juste qu'elle peut être composée de plusieurs champs.

  8. #8
    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
    Le problème c'est que ce que vous avez dit est faux, c'est "juste" du vocabulaire, ici :
    Citation Envoyé par madmox
    J'ai une table MaTable1 avec 3 clés primaires id1, id2, id3.
    Je pense que vous vouliez dire :
    "la clef primaire de MaTable1 est composée des trois colonnes (id1, id2, id3)".

    Même chose pour MaTable2.

  9. #9
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Le problème c'est que ce que vous avez dit est faux, c'est "juste" du vocabulaire, ici :


    Je pense que vous vouliez dire :
    "la clef primaire de MaTable1 est composée des trois colonnes (id1, id2, id3)".

    Même chose pour MaTable2.
    D'où mon :
    Enfin si c'était pour jouer sur les mots, oui une clé primaire même composite est unique pour une table, c'est juste qu'elle peut être composée de plusieurs champs.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    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 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Citation Envoyé par madmox Voir le message
    Vous connaissez pas les clés primaires composites ? C'est sûr qu'en mettre une seule simplifie pas mal certaines requêtes, mais dans certains cas c'est pas évident de faire sans, voire c'est beaucoup plus pratique qu'un simple id.

    Exemple : Clés primaires composites

    Enfin si c'était pour jouer sur les mots, oui une clé primaire même composite est unique pour une table, c'est juste qu'elle peut être composée de plusieurs champs.
    Si, mais une clé composée et 3 clés primaires, ce n'est pas du tout la même chose. Si j'ai 3 clés uniques sur une table, je peux identifier un enregistrement avec n'importe laquelle des trois (puisqu'elles sont uniques), alors qu'avec une clé composée c'est l'association des trois valeurs qui identifie un enregistrement.
    Je n'appelle pas celà jouer sur les mots...

    Tatayo.

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

Discussions similaires

  1. [MySQL-5.6] SELECTION DANS UNE TABLE AVEC PLUSIEURS RELATIONS
    Par glodybiss4 dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/10/2013, 12h34
  2. Réponses: 2
    Dernier message: 01/05/2013, 22h40
  3. Réponses: 6
    Dernier message: 08/12/2010, 08h47
  4. [WD15] Ajout de plusieurs enregistrements dans une table de liaison
    Par heiti dans le forum WinDev
    Réponses: 5
    Dernier message: 04/06/2010, 21h35
  5. Réponses: 2
    Dernier message: 27/04/2009, 23h01

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