En vrac mise à jour d'un tableau de lignes d'une autre table
2 tables:
Employees
- EmployeeID
- LeadCount
Leads
- leadID
- employeeID
Je veux mettre à jour le Employees.LeadCount
colonne en comptant le nombre de pistes dans le Leads
table qui ont la même EmployeeID
.
Remarque: Il peut y avoir plus que 1 en tête avec le même employé, je dois donc faire un DISTINCT(SUM(employeeID))
.
OriginalL'auteur public static | 2008-09-25
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur Jonny Buchanan
Vous êtes vous-même la mise en place d'un problème de synchronisation de données. Sous forme de lignes dans le Conduit de la table sont insérées, mises à jour ou effacées, vous devez mettre à jour les Employés.LeadCount colonne constamment.
La meilleure solution serait de ne pas stocker les LeadCount colonne à tous, mais recalculer le nombre de leads avec une agrégation SQL de la requête que vous avez besoin de la valeur. De cette façon, il sera toujours correct.
L'autre solution est de créer des déclencheurs sur le Conduit de table pour les commandes INSERT, UPDATE et DELETE, pour ne garder que les Employés.LeadCount colonne actuelle de tous les temps. Par exemple, l'utilisation de MySQL déclencher syntaxe:
Une autre option, si vous utilisez MySQL, est l'utilisation de multi-tables de mise à JOUR de la syntaxe. C'est une extension MySQL, SQL, ce n'est pas portable à d'autres marques de SGBDR. Tout d'abord, réinitialiser le LeadCount dans toutes les lignes à zéro, puis faire une jointure pour le Conduit de la table et l'incrément de la LeadCount dans chaque ligne produit par la jointure.
+ 1 pour ne pas stocker le LeadCount, mais -1 pour le déclencher. Je pense qu'ils devraient être séparés des réponses vraiment.
OriginalL'auteur Bill Karwin
Rejoint fonctionnent de la même pour les mises à jour et suppressions) comme ils le font pour les sélections (edit: dans certains populaire SGBDR", au moins*):
Le SUM(DISTINCT EmployeeId) n'a pas de sens, vous avez juste besoin d'un COUNT(*).
pour une raison quelconque, la requête de mise à jour est plus compliqué, espérons maintenant que je peux penser de la même façon!
Les jointures de mettre à JOUR et SUPPRIMER ne sont pas standard SQL mais certaines implémentations de soutien comme une extension. Qui SGBD prend en charge la syntaxe ci-dessus?
OriginalL'auteur Mark Brackett
IIRC qui sera très lent (MySQL est tout ce que j'ai utilisé)
OriginalL'auteur Jason Cohen
Vol à partir de ci-dessus et de retrait de l'dépendant de la sous-requête.
MODIFIER C'est "groupe" et non pas "distinctes" :b (merci Mark Brackett)
OriginalL'auteur BCS