2017-08-31 1 views
0

Je suis nouveau sur SQL. Essayer de mettre à jour une table avec un ID et COUNT à partir d'une autre table. Je dois obtenir à partir de ID Table1, COUNT d'ID et date la plus récente. Ensuite, mettez à jour Table2 avec ID, SUM, Date. Tableau 1 (ID, VID, date) PK = ID & VID Tableau2 (ID, SUM, date)Déclencheur SQL Server: Mettre à jour la table avec COUNT à partir d'une autre table

CREATE TRIGGER Trigger1 
    ON dbo.Table1 
    AFTER INSERT, UPDATE, DELETE 
AS 
    UPDATE dbo.Table2 
    SET SUM = (
    SELECT COUNT(ID) 
    FROM dbo.Table1 
); 

Je sais que cela est très incomplète et ne comprend pas l'ID et la date. Toute aide serait appréciée! Merci d'avance.

+0

Alors, quelle est votre question exactement? comment puis-je vous aider? –

+0

Dans Tableau1 ID et VID sont un PK combo. Il peut donc y avoir plusieurs entrées d'ID. Je dois obtenir un COUNT de l'ID avec la date la plus récente et mettre à jour une autre table.
Exemple: ID VID Date de 1 2 08/29/2017 1 3 08/30/2017 Tableau2 ID SUM Date de 1 2 30/08/2017 – Bart

+0

Votre tâche est pas claire. Montrez-nous sur des exemples de données comment vous voulez mettre à jour la Table2. –

Répondre

0

Essayez ceci -

CREATE TRIGGER Trigger1 
     ON dbo.Table1 
     AFTER INSERT, UPDATE, DELETE 
    AS 
    begin 
    DECLARE @id int 
    DECLARE @date datetime 
    SET NOCOUNT ON 
    select @id = id FROM INSERTED 
    set @date = select max(date) FROM table1 

     UPDATE dbo.Table2 
     SET SUM = a.sum 
      from 
     (SELECT COUNT(ID) as sum,id 
     FROM dbo.Table1 
     group by id) a 
     where a.id = table2.id 
     and Table2.date = @date 
     where a.id = table2.id; 
    end 
+0

Cela a fonctionné. Je vous remercie! – Bart

+0

L'utilisation de variables scalaires dans un déclencheur n'est pas une bonne idée. Il va tomber sur sa tête dès que vous essayez de faire un INSERT avec plus d'une rangée. –

+0

Oui, vous avez raison, je veux juste donner une idée. Je peux utiliser des sous-requêtes directes au lieu de variables. – Anagha

0

Je devine que vous cherchez quelque chose comme ça ...

USE tempdb; 
GO 

-- Start by creating a couple of tables in tempdb... 
CREATE TABLE dbo.OrderHeader (
    OrderID INT NOT NULL, 
    DetailCount INT NOT NULL 
     CONSTRAINT df_OrderHeader_DetailCount DEFAULT (0), 
    CONSTRAINT pk_OrderHeader_OrderID PRIMARY KEY CLUSTERED (OrderID) 
    ); 
GO 

INSERT dbo.OrderHeader(OrderID) VALUES 
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10), 
    (11),(12),(13),(14),(15),(16),(17),(18),(19),(20), 
    (21),(22),(23),(24),(25),(26),(27),(28),(29),(30); 
GO 

CREATE TABLE dbo.OrderDetails (
    OrderDetailID INT NOT NULL IDENTITY(1,1), 
    OrderID INT NOT NULL 
     CONSTRAINT fk_OrderHeader_OrderID FOREIGN KEY REFERENCES dbo.OrderHeader (OrderID) 
      ON UPDATE CASCADE ON DELETE CASCADE, 
    Quantity INT NOT NULL 
     CONSTRAINT df_OrderDetails_Quantity DEFAULT (1) 
     CONSTRAINT ck_OrderDetails_Quantity CHECK (Quantity > 0) 
    CONSTRAINT pk_OrderDetails_OrderID PRIMARY KEY CLUSTERED (OrderDetailID) 
    ); 
GO 

-- create a nonclustered index on dbo.OrderDetails.OrderID so that the trigger has the ability to do a seek operation. 
CREATE NONCLUSTERED INDEX ix_OrderDetails_OrderID ON dbo.OrderDetails (OrderID); 

-- Create an AFTER trigger on dbo.OrderDetails that will update dbo.OrderHeader after ever insert. 
CREATE TRIGGER tr_UpdateDetailCount ON dbo.OrderDetails 
AFTER INSERT 
AS 
BEGIN 
    UPDATE oh SET 
     oh.DetailCount = odx.DetailCount 
    FROM 
     dbo.OrderHeader oh 
     JOIN Inserted i 
      ON oh.OrderID = i.OrderID 
     CROSS APPLY (
        SELECT 
         DetailCount = COUNT(1) 
        FROM 
         dbo.OrderDetails od 
        WHERE 
         oh.OrderID = od.OrderID 
        ) odx; 
END; 
GO 

-- Insert some values into dbo.OrderDetails... 
INSERT dbo.OrderDetails(OrderID, Quantity) 
SELECT TOP 10000 
    ABS(CHECKSUM(NEWID())) % 30 + 1, 
    ABS(CHECKSUM(NEWID())) % 5 + 1 
FROM 
    dbo.tfn_Tally(200, 1) t 

--====================================== 

-- Check to see that the trigger has worked as expected... 
SELECT * FROM dbo.OrderHeader oh; 
SELECT * FROM dbo.OrderDetails od; 

--====================================== 

-- And cleanup... 
DROP TABLE dbo.OrderDetails; 
DROP TABLE dbo.OrderHeader; 

dbo.OrderHeader après l'insertion dans dbo.OrderDetails

OrderID  DetailCount 
----------- ----------- 
1   5 
2   10 
3   5 
4   15 
5   4 
6   6 
7   7 
8   7 
9   9 
10   11 
11   6 
12   6 
13   3 
14   6 
15   2 
16   7 
17   8 
18   6 
19   5 
20   8 
21   6 
22   6 
23   6 
24   11 
25   12 
26   7 
27   4 
28   5 
29   1 
30   6