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

InterBase Discussion :

INTERBASE: DELETE avec sous requete conditionnelle


Sujet :

InterBase

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut INTERBASE: DELETE avec sous requete conditionnelle
    INTERBASE ne semble pas accepter la syntaxe suivante ( empruntée au cours de SQLPro ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DELETE FROM T_PROSPECT
    WHERE  (CLI_NOM, CLI_PRENOM) = (SELECT PRP_NOM, PRP_PRENOM
                                    FROM   T_CLIENT)
    avec le message d'erreur 'Token unknown , ' laissant supposer qu'il n'est pas possible de sélectionner plusieurs colonnes comme critère de sélection.
    Comment contourner cet obstacle ( syntaxique ? ) pour supprimer les rangées d'une table existant dans une autre table ?

    :

    Merci de vos conseils

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Il faut le faire avec une requete corellée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM T_PROSPECT TP
    WHERE  EXISTS (SELECT * FROM   T_CLIENT TC where TC.PRP_NOM = TP.CLI_NOM and TC.PRP_PRENOM= TP.CLI_PRENOM)
    Mais bon normalement dans la table T_PROSPECT on met une clé étrangère ce qui évite de devoir recopier le nom et prénom de votre client dans la table prospect et permet de retrouver plus rapidement les enregistrements relatifs à un client. Et aussi permet si vous le désirer de supprimer tous les enregistrements relatifs à votre client quand vous le supprimez.

  3. #3
    Membre actif Avatar de Fares BELHAOUAS
    Homme Profil pro
    Développeur Flex & Java
    Inscrit en
    Mars 2002
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Flex & Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 182
    Points : 252
    Points
    252
    Par défaut
    Salam,

    Je crois que cette requête fait l'affaire aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM T_PROSPECT TP 
    WHERE  (SELECT TC.PRP_NOM FROM   T_CLIENT TC where TC.PRP_NOM = TP.CLI_NOM and TC.PRP_PRENOM= TP.CLI_PRENOM) IS NOT NULL
    Bon courage.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Les deux fonctionnent parfaitement.
    Seul problème, mais de taille : la lenteur !
    J'ai pensé arranger les choses en rajoutant des index sur les colonnes adéquates, sans grand résultat probant.
    Mon but est d'insérer de nouvelles lignes et de remplacer ( ou de mettre à jour ) les lignes pré-existantes ( de même valeur d'index ) d'une table d'un millier de ligne dans une table qui en fait environ 120 000.

    Merci encore de vos irremplaçables conseils.

  5. #5
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Salut,

    J'ai pensé arranger les choses en rajoutant des index sur les colonnes adéquates, sans grand résultat probant.
    Si tu fais un Delete, il vaut mieux supprimer tous les index/FK/PK avant et de les reconstruire après.

    Ainsi, les ressources nécessaire à la suppression sont moins important et la reconstruction des index/FK/PK permet de les avoir optimiser sur le dernier 'état' des données.

    A+

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par yobenzen
    Si tu fais un Delete, il vaut mieux supprimer tous les index/FK/PK avant et de les reconstruire après.

    Ainsi, les ressources nécessaire à la suppression sont moins important et la reconstruction des index/FK/PK permet de les avoir optimiser sur le dernier 'état' des données.
    Celà va dépendre de la proportion de suppression par rapport au nombre d'enregistrements de la table.
    Or je ne pense pas qu'il veuille supprimer la majorité des enregistrements?

    Il faut en effet créer 2 indexes
    le premier sur la table T_PROSPECT (PRP_NOM, PRP_PRENOM)
    et le second sur la table T_client (CLI_NOM, CLI_PRENOM).

    A moins que pour la table prospect vous n'ayez construit un foreign key sur nom, prenom dans ce cas l'indexe exise déjà.

    Ensuite une autre remarque plus général, si dans la table prospect vous aviez plutot mis une colonne FK_ID_CLI (représentant la clé primaire de la table client) de type integer à la place de NOM et PRENOM, ça serait certainement plus performant, car un integer est plus petit en taille et donc prend moins de place et les recherche/comparaison sont plus rapide et facile à faire sur un integer que sur des chaines.
    Mais bon cette remarque est valable pour les gros volumes.

    Qu'appelez vous lenteur du traitement ? Combien d'enregistrements dans votre table client, votre table prospect et combiens sont concernés par la supression ?

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Points : 376
    Points
    376
    Par défaut
    attention que les index sont inutilisés dans les "sous-requêtes" et qu'il est infiniment plus rapide de construire une procédure stockée qui se charge de détruire les enregistrements

    un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    create procedure deletemassive
    as
      declare variable db_key char(8);
    begin
      for select rdb$db_key from matable where mescondistions
      into :db_key do
      begin
     
        delete matable where rdb$db_key = :db_key;
     
      end
     
    end
    c'est le procédé le plus rapide, je n'est encore rien trouvé de mieux pour faire le ménage.

    attention toutefois aux index qui sont désorganisés en cas de "delete" massif, dans ce cas, le plus sage et de les désactivés avant l'opération et de les réactiver après, enfin, si cela est possible.

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

Discussions similaires

  1. Delete avec sous requetes qui retourne plusieurs resultats
    Par Biosox dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/07/2010, 14h55
  2. DELETE avec sous requete
    Par tinmarbusir dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/02/2008, 00h54
  3. Delete distant avec sous requete local
    Par Sam 069 dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/09/2007, 11h01
  4. DELETE avec sous-requête
    Par say dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2005, 08h20
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

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