查找最近添加的行并添加值

时间:2012-09-19 06:37:49

标签: sql sql-server compare

我有一张桌子每天早上都会重新加载和上传。它没有任何日期/时间列,也没有自动增量列。

我需要一个查询来确定每天早上添加了哪些行,并为表中的每一行添加一个具有特定值的新列(如果是新的则为一个,如果不是则为另一个)。此外,如果可能,添加第二列,其中包含添加行的日期。

我在想的是我每天都会复制表格,然后在第二天将其与新表格进行比较。

这是否可以做到,如果是这样,我该怎么做?有没有更好的方法而不改变数据写入表格的方式?

1 个答案:

答案 0 :(得分:0)

是的,考虑到原始表格的限制,创建第二个表似乎是一个合理的解决方案

好的,所以在第1天,你创建了影子表并填充它:

CREATE TABLE Shadow (/* Same columns as original, plus added date, magic value column */)
INSERT INTO Shadow (/* Same columns as original, plus added date, magic value column */)
SELECT /* Columns, plus todays date and the magic value column */ FROM Original

然后,在随后的日子里:

ALTER TABLE Original ADD MagicColumn int null
GO
ALTER TABLE Original ADD AddedDate date null
GO
MERGE INTO Original o
USING Shadow s
     ON o.PK1 = s.PK1 and o.PK2 = s.PK2

WHEN MATCHED
   THEN UPDATE
      SET
         AddedDate = s.AddedDate,
         MagicColumn = 1 /* Value for updated */

WHEN NOT MATCHED BY SOURCE
   THEN UPDATE
      SET
         AddedDate = CURRENT_TIMESTAMP,
         MagicColumn = 0; /* Value for new */
GO
TRUNCATE TABLE Shadow
GO
INSERT INTO Shadow (/* Same columns as original, plus added date, magic value column */)
SELECT /* All columns */ FROM Original

其中一些陈述需要分开(例如ALTER TABLE个批次需要与MERGE不同),所以如果你&#39 ;在SQL Agent作业中执行此操作时,它们应该分开执行。

我一直在提及"魔术价值列",因为我不知道该怎么称呼包含的列:

  

某个值(如果它是新的,则为1;如果不是,则为另一个值)