Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/02/2005, 13h02   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 46
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 46
Points : 13
Points : 13
Par défaut INTERBASE: DELETE avec sous requete conditionnelle

INTERBASE ne semble pas accepter la syntaxe suivante ( empruntée au cours de SQLPro ):

Code :
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
Papino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2005, 13h52   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Il faut le faire avec une requete corellée.

Code :
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2005, 15h01   #3
Membre confirmé
 
Avatar de Fares BELHAOUAS
 
Homme Fares Belhaouas
Développeur Flex & Java
Inscription : mars 2002
Messages : 182
Détails du profil
Informations personnelles :
Nom : Homme Fares Belhaouas
Âge : 36
Localisation : Algérie

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

Informations forums :
Inscription : mars 2002
Messages : 182
Points : 236
Points : 236
Envoyer un message via MSN à Fares BELHAOUAS Envoyer un message via Yahoo à Fares BELHAOUAS
Salam,

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

Code :
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.
Fares BELHAOUAS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2005, 18h08   #4
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 46
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 46
Points : 13
Points : 13
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.
Papino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2005, 20h17   #5
Rédacteur
 
Inscription : janvier 2004
Messages : 2 123
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2004
Messages : 2 123
Points : 1 977
Points : 1 977
Salut,

Citation:
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+
__________________
Ancien pseudo : yobenzen

Recherche un emploi de Chef de Projet ou Développeur en Normandie
Delphi/Oracle/Interbase
Migration vers symfony

CV :
- LinkedIn
- Viadeo
Benjamin GAGNEUX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2005, 09h18   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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 ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2005, 22h55   #7
Membre éclairé
 
Inscription : décembre 2004
Messages : 379
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 379
Points : 304
Points : 304
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 :
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.
jean-jacques varvenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h28.


 
 
 
 
Partenaires

Hébergement Web