我想弄清楚您为什么要经历处理触发器的麻烦。只需重新格式化您的插入,以便它自动处理您的状况。
我必须假设 CCCMTRL 表中还有一些其他字段,其中一个是价格日期变化,因为您没有提供价格总是上涨或下跌的条件,所以我 假设这是由某种日期字段跟踪的,我在下面的示例查询中将其称为 DATEFIELD。
基本上,此查询将识别 *new *price 是否不再匹配 CCCMTRL 表中最近的 old 价格(排序由 ROW_NUMBER() 窗口函数执行)。如果您有任何不匹配,它们将被插入到 CCCMTRL 表中:
--Optionally insert DATEFIELD if this is not tracked via default constraint
INSERT INTO CCCMTRL(MTRL,COMPANY,OLDPRICE,NEWPRICE)
SELECT
t_window.MTRL,
t_window.COMPANY,
t_window.OLD_PRICE,
t_window.NEW_PRICE
FROM (
SELECT
MTRL,
COMPANY,
OLD.PRICE AS OLD_PRICE,
NEW.PRICE AS NEW_PRICE,
ROW_NUMBER() (PARTITION BY OLD.MTRL, OLD.COMPANY ORDER BY OLD.DATEFIELD DESC) AS RowNum
FROM CCCMTRL OLD LEFT OUTER JOIN CCCMTRL_NEW NEW
ON OLD.MTRL = NEW.MTRL
AND OLD.COMPANY = NEW.COMPANY
WHERE OLD.PRICE <> NEW.PRICE
) t_window
WHERE RowNum = 1
下面是一个快速示例查询,它通过一个工作示例有效地展示了我所说的内容。希望这可以解决您的问题,而不会使您的数据库与触发器混淆。
SELECT COL1, COL2, DT
FROM
(
SELECT COL1, COL2, DT,
-- Create Windows Based On Colums and Assign Number based on Age of records
ROW_NUMBER() OVER (PARTITION BY COL1, COL2 ORDER BY DT DESC) AS RowNum
FROM
(
-- Row will be filtered out as it's the oldest of Liquids/Blues
SELECT 'Liquid' AS COL1, 'Blue' AS COL2, GETDATE() - 1 AS DT
UNION
SELECT 'Liquid', 'Blue', GETDATE()
UNION
SELECT 'Liquid', 'Red', GETDATE()
UNION
-- Row will be filtered out as it's the oldest of Solid/Greens
SELECT 'Solid', 'Green', GETDATE()
UNION
SELECT 'Solid', 'Green', GETDATE() + 2
) t_example
) t_windowed
WHERE RowNum = 1