J'ai 2 tables, I_786 (100k enregistrements) et B_786 (700k enregistrements). La table I_786, tous les enregistrements doivent être supprimés de la table B_786. Ici, la table I est dérivée de la table B en prenant les 100 premiers enregistrements de celle-ci en utilisant rownum. Après cela, je dois supprimer les mêmes enregistrements qui sont dans la table I. J'ai créé la requête comme ci-dessous,
DELETE FROM B_786 WHERE EXISTS (SELECT * FROM I_786);
Mais il supprime toutes les données de la table B_786. Ici, la condition où ne fonctionne pas. Comment optimiser la clause where ici?
3 Réponses :
Vous devez utiliser une colonne sur laquelle vous souhaitez supprimer l'enregistrement de la table B_786, comme s'il y a 2 colonnes dans la table B_786 (nom d'id) et ayant 700k enregistrements, et il y a 100k enregistrements I_786 avec des colonnes (id, nom). Donc, pour supprimer les données de la table B_786 qui correspondent à l'enregistrement avec la table I_786.
Supprimer de B_786 où identifiant dans (sélectionnez l'identifiant dans I_786);
En exécutant la commande ci-dessus, les données seront supprimées de B_786 qui correspond à l'id de I_786.
DELETE FROM B_786 WHERE EXISTS (SELECT 1 FROM I_786 where I_786.id = B_786.id);
Dans votre cas, vous devez utiliser une clé de référence, un champ dans une table qui fait référence à la CLÉ PRIMAIRE dans une autre table.
En supposant que pid comme clé référencée dans la table I_786 et fid comme clé référencée dans B_786 p>
Votre requête ressemblera à ceci:
DELETE FROM B_786 WHERE B_786.fid IN (SELECT I_786.pid FROM I_786) as temp;