我有一张桌子,每天早上都会重新加载和整理。它没有任何日期/时间列,也没有自动增量列。
我需要一个查询来确定每天早上添加了哪些行,并为具有特定值的每一行添加一个新列(如果是新的,则为新列,如果不是,则为另一列)。此外,如果可能,添加第二列,其中包含添加该行的日期。
我在想的是我每天都复制表格,然后第二天将其与新的进行比较。
这甚至可以做到吗,如果可以,我该怎么做?有没有更好的方法而不改变数据写入表的方式?
我有一张桌子,每天早上都会重新加载和整理。它没有任何日期/时间列,也没有自动增量列。
我需要一个查询来确定每天早上添加了哪些行,并为具有特定值的每一行添加一个新列(如果是新的,则为新列,如果不是,则为另一列)。此外,如果可能,添加第二列,其中包含添加该行的日期。
我在想的是我每天都复制表格,然后第二天将其与新的进行比较。
这甚至可以做到吗,如果可以,我该怎么做?有没有更好的方法而不改变数据写入表的方式?
是的,考虑到原始表的约束,创建第二个表似乎是一个合理的解决方案
好的,所以在第 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
),因此如果您在 SQL 代理作业中执行此操作,它们应该在不同的步骤中。
我一直提到“魔法值列”,因为我不确定如何调用包含以下内容的列:
某个值(如果是新的,则为一个,如果不是,则为另一个)