简体   繁体   中英

SQL Server Trigger: Update table with COUNT from another table

I am new to SQL. Trying to update a table with an ID and COUNT from another table. I need to get from Table1 ID, COUNT of ID, and most recent Date. Then update Table2 with ID, SUM, Date. Table1 (ID, VID, Date) PK = ID & VID Table2 (ID, SUM, Date)

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

I know this is very incomplete and does not include the ID, and Date. Any help would be appreciated! Thanks in advance.

I'm guessing that you're looking for something like this...

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 after the insert into 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

Try this -

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM