首页 > 解决方案 > 根据与另一个表比较的条件将新的数据行插入到表中

问题描述

我有一个跟踪器表,它跟踪与我们的客户关联的某个数字,称为“跟踪器”。该表如下所示:

customer_id    value     date_of_value
11111            2          2020-12-14
23332            6          2021-01-15

此表从另一个名为“Values”的表中获取此信息,该表与上面的表完全相同,但没有 date_of_value 列。该表每天都在更新,与客户关联的值会被新值覆盖。我想做的是创建一个小作业,以便“跟踪器”表查看“值”表以查看值是否已更新。如果是这样,我想在“跟踪器”表中插入一个新行,其中包含客户 ID、新值和值更改日期。在我看来,查询看起来像这样:

CASE WHEN Tracker.value != Values.value
   THEN INSERT INTO Tracker (customer_id, value, date_of_value)
   VALUES (Values.id, values.value, GETDATE())

我尝试将它与 UPDATE 语句一起使用,但它们都不起作用。理想情况下,“跟踪器”表将如下所示:

customerr_id    value      date_of_value
11111             2           2020-12-14
2332              6           2021-01-15
11111             3           2021-01-22
2332              8           2021-01-24 

如何设置此查询,以便在创建作业时插入包含更新信息的新行?当我尝试使用 UPDATE 方法时,它覆盖了“Tracker”表中的信息。

标签: sqlsql-server

解决方案


嗯。. . 您需要表中的最新值tracker。然后将其与现有值进行比较,并在有差异的地方插入:

INSERT INTO Tracker (customer_id, value, date_of_value)
    SELECT v.customer_id, v.value, GETDATE()
    FROM (SELECT v.*,
                 ROW_NUMBER() OVER (PARTITION BY v.customer_id ORDER BY v.value DESC) as seqnum
          FROM values v
         ) v LEFT JOIN
         Tracker t
         ON v.customer_id = t.customer_id AND
            v.value = t.value
    WHERE v.seqnum = 1 AND t.customer_id IS NULL;

推荐阅读