基于复合主键更新SQL表

时间:2017-10-24 15:51:52

标签: sql-server tsql etl

我有一个每天运行的ETL过程(CSV到SQL数据库),但源中的数据有时会发生变化,因此我希望第二天再次使用更新的文件运行它。

如何编写SQL语句以查找所有差异?

例如,假设Table_1的复合PRIMARY KEYFK_1FK_2FK_3组成。

我是在SQL中还是在ETL过程中执行此操作?

感谢。

修改 我现在意识到这个问题太宽泛了。无视。

1 个答案:

答案 0 :(得分:1)

您可以使用EXCEPT查找缺少的IDs。例如:

SELECT FK_1,  FK_2, FK_2
FROM new_data_table
EXCEPT
SELECT FK_1,  FK_2, FK_2
FROM current_data_table;

更好(在性能方面)实现这些ID,然后将这个新表加入new_data_table以插入所有列。

如果您需要在一个查询中执行此操作,则可以使用简单的LEFT JOIN。例如:

INSERT INTO current_data_table
SELECT A.*
FROM new_data_table A
LEFT JOIN current_data_table B
    ON A.FK_1 = B.FK_1
    AND A.FK_2 = B.FK_2
    AND A.FK_3 = B.FK_3
WHRE B.[FK_1] IS NULL;

我们的想法是获取new_data_table中的所有记录,current_data_table表(WHRE B.[FK_1] IS NULL)中没有匹配。