[英]SQL Server Trigger: Update table with COUNT from another table
I am new to SQL. 我是SQL新手。 Trying to update a table with an ID and COUNT from another table.
尝试使用另一个表中的ID和COUNT更新表。 I need to get from Table1 ID, COUNT of ID, and most recent Date.
我需要获取表1的ID,ID的COUNT和最近的日期。 Then update Table2 with ID, SUM, Date.
然后用ID,SUM,Date更新Table2。 Table1 (ID, VID, Date) PK = ID & VID Table2 (ID, SUM, Date)
表1(ID,VID,日期)PK = ID和VID表2(ID,SUM,日期)
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. 我知道这是非常不完整的,并且不包括ID和日期。 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 插入dbo.OrderDetails之后的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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.