2009-10-19 10 views
1

J'ai une application de type tirage des employés, les tables ressemblent:Mise à jour le tableau principal en fonction des lignes d'une table secondaire

Employee (ID, name, selectionCount) 

Selections (employeeID, ipAddress) 

Maintenant, je besoin d'une requête de mise à jour qui comptera le nombre de sélections pour chaque employeeID (avec des adresses IP uniques) et mettez à jour la colonne selectionCount dans la table Employee.

Répondre

1

Quelque chose comme cela devrait fonctionner:

WITH SelectionCounts(EmployeeId, SelectionCount) 
AS 
(
    SELECT s.EmployeeId, COUNT(DISTINCT IpAddress) AS SelectionCount 
    FROM Selections s 
    GROUP BY s.EmployeeId 
) 
UPDATE Employee 
SET SelectionCount = sc.SelectionCount 
FROM SelectionCounts sc 
WHERE ID = sc.EmployeeId 

n'a pas testé si la syntaxe ne peut pas être tout à fait correct.

0

pas un expert SQL Server, mais quelque chose comme cela devrait fonctionner:

update Employee a 
    set selectionCount = (select count(*) 
          from Selections 
          where employeeID = a.ID) 

En aparté, je suppose que vous savez que le design est un peu dénormaliser, qui peut être indésirable dans certaines situations.

+0

son souhaitable dans le mien :) – mrblah

1
update Employee 
set selectionCount = (select count(distinct ipAddress) 
         from Selections 
         where Selections.emmployeeID = Employee.ID) 
1

Assumer solution Najmeddine du conseil d'administration, vous pouvez mettre ce code dans un insert et/ou d'un déclencheur de mise à jour de la table des sélections dans SQL Server:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER UpdateSelectionCount ON Selections 
    AFTER UPDATE, INSERT 
AS 
BEGIN 
    SET NOCOUNT ON 

    UPDATE 
     Employee 
    SET 
     selectionCount = (SELECT 
           COUNT(DISTINCT ipAddress) 
          FROM 
           Selections 
          WHERE 
           Selections.EmployeeID = Employee.ID) 

END 
GO 
Questions connexes