【发布时间】:2016-05-07 11:55:16
【问题描述】:
我有以下 SQL 查询,它跟踪商品价格、日期和价格变化时间,并将值保存在名为 dbo.NewPriceLabel 的表中。
我试图让它只保留基于修改日期和时间的最新修改,并删除同一主键的旧值。 pk 是PLU。
这是我当前的查询:
USE [ItemTable]
GO
/****** Object: Table [dbo].[NewPriceLabel] Script Date: 05/07/2016 03:46:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[NewPriceLabel](
[PLU] [varchar](25) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Description] [varchar](40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Sizes] [varchar](7) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[OldPrice] [real] NULL,
[NewPrice] [real] NULL,
[Datechange] [datetime] NOT NULL CONSTRAINT [NewPriceLabel_Datechange] DEFAULT (getdate()),
CONSTRAINT [PK_NewPriceLabel] PRIMARY KEY CLUSTERED (
[PLU] ASC,
[Datechange] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = ON) ON [PRIMARY]) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
【问题讨论】:
-
所以你需要一个触发器,当插入具有相同 PLU 的新行时删除旧记录?
-
您问题中的“查询”只是表 DDL。如果表的目的是只保留最近 Datechange 的行,您应该从主键中删除 Datechange,以便每个 PLU 只有一行,然后您可以使用
MERGE语句插入,如果它没有' 尚不存在,仅当 Datechange 晚于当前值时才更新。 -
@gofr1:谢谢。你能给我看一个这个触发器的示例脚本吗
-
@DanGuzman:你能帮我写下这个 MERGE 语句吗?谢谢
-
@gofr1:使用此触发器时出现以下错误:消息 102,级别 15,状态 1,过程 TRG_AFTER_INS_UPD,第 9 行“END”附近的语法不正确。
标签: sql-server duplicates compare