2017-08-31 60 views
0

我是SQL新手。嘗試使用另一個表中的ID和COUNT更新表格。我需要從表1的ID,ID的COUNT和最近的日期。然後用ID,SUM,Date更新Table2。 表1(ID,VID,日期)PK = ID & VID 表2(ID,金額,日期)SQL Server觸發器:使用另一個表中的COUNT更新表

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

我知道這是非常不完整,不包括ID,和日期。任何幫助,將不勝感激!提前致謝。

+0

那麼你的問題到底是什麼?我怎麼幫你? –

+0

在Table1中ID和VID是一個組合PK。所以可以有多個ID條目。我需要獲取最近日期的ID的COUNT並更新另一個表。
實施例: ID VID日期 1 2 2017年8月29日 1 3 2017年8月30日 表2 ID SUM日期 1 2 2017年8月30日 – Bart

+0

你的任務是不明確的。向我們展示樣例數據如何更新Table2。 –

回答

0

試試這個 -

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

這工作。謝謝! – Bart

+0

在觸發器中使用標量變量不是一個好主意。只要您嘗試使用多於一行的INSERT,它就會落在它的頭上。 –

+0

是的,你是對的我只是想提出一些想法。我可以使用直接子查詢而不是變量。 – Anagha

0

我猜你正在尋找這樣的事情...插入到dbo.OrderDetails後

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

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 
相關問題