Sql 根据表中存在的值采取不同的操作
我有一个表,其中我添加了其他表中特定列值的更改: 更新日志表: 表名 柱形过滤器 过滤名称 过滤值 差别 日期 水果 果名 苹果 4. 0 1/13/2021 水果 果名 梨 5. 0 1/13/2021Sql 根据表中存在的值采取不同的操作,sql,sql-server,tsql,sql-insert,Sql,Sql Server,Tsql,Sql Insert,我有一个表,其中我添加了其他表中特定列值的更改: 更新日志表: 表名 柱形过滤器 过滤名称 过滤值 差别 日期 水果 果名 苹果 4. 0 1/13/2021 水果 果名 梨 5. 0 1/13/2021 你问题中的代码相当混乱。例如: #未定义HistoryUpdatesSuccess 使用FRUITS的聚合子查询格式不正确 JOIN条件缺少筛选值 但是,我想我知道您想要做什么——插入新行,其中包含一个DIFF列,该列合并了现有数据中的最新数据 这看起来像是历史记录表中最新记录的左联接。剩
你问题中的代码相当混乱。例如:
#未定义HistoryUpdatesSuccess
- 使用
的聚合子查询格式不正确FRUITS
条件缺少筛选值JOIN
DIFF
列,该列合并了现有数据中的最新数据
这看起来像是历史记录表中最新记录的左联接。剩下的就是COALESCE()
但是如果我有了一个新的水果,这会起作用吗。我认为左连接将忽略它,因为它以前在UpdatesLogTable中不存在。这是我的主要任务concern@Yana . . . 否,
左连接不会忽略它。这就是为什么查询使用LEFT JOIN
,而不是其他类型的JOIN
。我修复了#HistoryUpdatesSuccess:)它现在是正确的名称。哦,我知道这里发生了什么:)您将UpdatesLogTable左键连接到水果表,这就是为什么它会工作的原因。谢谢我尝试了相反的方法,这就是为什么它对我不起作用。不是行号()吗。。。如果我们有大桌子,分区会很慢吗?@Yana。在大的表上,所有的东西都是慢的,所以替代品不一定要快得多(实际上相关的子查询通常有点快,但使查询更复杂,特别是对于外部连接)。考虑在INSERT 和<代码>上使用触发器<代码>更新< /COD>
INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
SELECT f.TableName, f.ColumnFilter, f.FilterName, f.FilterValue,
COALESCE(f.FilterValue - ult.FilterValue, 0),
LUP as [Date]
FROM FRUITS F LEFT JOIN
(SELECT ult.*,
ROW_NUMBER() OVER (PARTITION BY TableName, ColumnFilter ORDER BY LastUpdateDate) as seqnum
FROM UpdatesLogTable ult
) ult
ON tr.TableName = ult.TableName AND
tr.ColumnFilter = ult.ColumnFilter AND
tr.FilterName = ult.FilterName
seqnum = 1;