2008-09-18 22 views
1

Maintenant, j'ai vu cette question dans another forum mais la réponse n'était pas acceptable. Supposons que j'ai deux tables, la table Groupes et la table Éléments. Les tables n'ont pas de relations définies. La table Elements a un champ IdGroup qui fait référence au champ IdGroup (PK) de la table Groups.Suppression de lignes dans des tables jointes à l'aide de ADO

J'utilise la requête suivante par un jeu d'enregistrements ADO pour remplir les valeurs de tables à une grille de données:

SELECT Elements.*, Groups.GroupName 
FROM Elements 
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup 

De cette grille, je veux appuyer sur Supprimer pour supprimer un élément. Voici mon problème. Lorsque j'ai utilisé DAO, la fonction DAO Delete() a supprimé uniquement l'enregistrement dans le groupe Elements. C'était le comportement attendu.

Lorsque j'ai changé pour ADO, la fonction Delete() a supprimé les enregistrements dans les deux tables, l'enregistrement de l'élément et le groupe auquel appartenait l'élément!

Existe-t-il un moyen de reproduire le comportement DAO dans ADO sans avoir à définir des relations dans les tables?

Note: Je sais qu'il existe des alternatives (l'exécution de requêtes DELETE pourrait faire le travail). Montrez-moi simplement un moyen de le faire dans ADO, ou dites que cela ne peut pas être fait.

Répondre

1

Rewrite requête à:

  • remplacer le INNER JOIN avec une clause WHERE consistant en un EXISTE;
  • utilisez une sous-requête dans la clause SELECT pour renvoyer la valeur de Groups.GroupName.

Exemple:

SELECT Elements.*, 
     (
     SELECT Groups.GroupName 
      FROM Groups 
     WHERE Elements.IdGroup = Groups.IdGroup 
     ) 
    FROM Elements 
WHERE EXISTS (
       SELECT * 
       FROM Groups 
       WHERE Elements.IdGroup = Groups.IdGroup 
      ); 

Je l'ai testé cela en utilisant SQL Server 2008 avec un jeu d'enregistrements ADO défini comme la propriété DataSource d'un contrôle Microsoft OLEDB DataGrid (MSDATGRD.OCX) puis de supprimer la ligne par la gird (je suppose que vous faites quelque chose de similaire) et la ligne est en effet supprimée de la table Elements (c'est-à-dire que la ligne dans les groupes reste non supprimée).

Notez que la requête révisée peut avoir un impact négatif sur les performances lors de l'extraction des lignes.