JOIN 的替代方案

Rah*_*dam 1 sql-server sql-server-2014

第一次触发

ALTER TRIGGER [dbo].[Price_Modified]
    ON [dbo].[stock_recieve]
    AFTER UPDATE
AS
SET NOCOUNT ON;
IF UPDATE (Stock_out) 
BEGIN
    UPDATE s
    SET value = new.Item_Price * new.Stock_out
    FROM stock_recieve AS s
    JOIN inserted AS new ON new.[Bill No] = s.[Bill No]
    JOIN deleted AS old ON old.[Bill No] = s.[Bill No]
END;
Run Code Online (Sandbox Code Playgroud)

第二个触发器。

 ALTER TRIGGER [dbo].[newval] 
      ON [dbo].[stock_recieve]
        AFTER UPDATE
    AS
    SET NOCOUNT ON;
    IF UPDATE (Stock_out) 
    BEGIN
        UPDATE s
        SET Uservalue = new.Item_Price * new.Stock_out
        FROM stock_recieve AS s
        JOIN inserted AS new ON new.[Bill No] = s.[Bill No]
        JOIN deleted AS old ON old.[Bill No] = s.[Bill No]
    END;
Run Code Online (Sandbox Code Playgroud)

第一次 stock_out 更新时获得的结果。

| Item_Price | Stock_in | Stock_out | Value | Uservalue |
|------------|----------|-----------|-------|-----------|
| 50         | 200      | 100       | 5000  | 5000      |
| 100        | 50       | 20        | 2000  | 2000      |
| 30         | 100      | 40        | 1200  | 1200      |
Run Code Online (Sandbox Code Playgroud)

在第二次 stock_out 更新时获得的结果。

| Item_Price | Stock_in | Stock_out | Value | Uservalue |
|------------|----------|-----------|-------|-----------|
| 50         | 200      | 200       | 10000 | 5000      |
| 100        | 50       | 40        | 4000  | 2000      |
| 30         | 100      | 100       | 3000  | 1800      |
Run Code Online (Sandbox Code Playgroud)

第一个触发器执行其假设的操作,但我希望 Uservalue 上的第二个触发器不添加而是替换结果。希望这很清楚@Ypercube

Mil*_*lan 6

您应该使用计算列而不是使用触发器。
这样,stock_out 的任何变化都会影响用户评分。
它将自动计算,并且没有重复的行。

然后可以使用 AFTER UPDATE TRIGGER 来存储先前用户评分的记录,方法是从 DELETED 读取数据并将其插入到审计表中。