sql - 如何在 SQL Server 中进行增量加载
问题描述
我有两张表product_source
(有 50 条记录)和product_target
(没有记录)。
create table product_source
(
productId varchar(10),
productName varchar(50),
productStatus varchar(20),
productType varchar(20),
productDesc varchar(50)
)
create table product_target
(
productId varchar(10),
productName varchar(50),
productStatus varchar(20),
productType varchar(20),
productDesc varchar(50)
)
表中样本数据product_source
:
productId productName productStatus productType productDesc
------- ---------- ----------- ----------- -----------
111 lenova pending computer hp_computer
222 pendrive delivered gadget storage
777 harddisk pending storage storagedevice
...50 records
例如,我使用插入语句将数据加载到目标表中。
insert into product_target as
select *
from product_source -- 50 records loaded
product_target
桌子:
productId productName productStatus productType productDesc
------- ---------- ----------- ----------- -----------
111 lenova pending computer hp_computer
222 pendrive delivered gadget storage
...50 records got loaded
现在再次将一些数据(例如 100 条新记录)加载到源表中product_source
,现在如何仅将这 100 条新记录加载到product_target
表中,其中列is_status
说明是否在源中插入/更新了任何新记录,然后应该添加如下。
product_source
表(带有新记录):
productId productName productStatus productType productDesc
------- ---------- ----------- ----------- -----------
111 samsung delivered mobile sam_mobile
989 scandisk inprogress pendrive pendrive_64gb
546 mouse inprogress computer mouse_computer
666 keyboard inprogress computer keyboard_computer
777 harddisk delivered storage storagedevice
...100 records
product_target
桌子:
productId productName productStatus productType productDesc Is_status
------- ---------- ----------- ----------- ----------- ----------
555 lenova pending computer hp_computer inserted
111 lenova delivered computer hp_computer updated
777 harddisk delivered storage storagedevice updated
989 scandisk inprogress pendrive pendrive_64gb inserted
546 mouse inprogress computer mouse_computer inserted
666 keyboard inprogress computer keyboard_computer inserted
...
同样,如果表中每天都发生加载product_source
,那么如何加载product_target
表中记录的每个新插入/更新?
product_source
我在从到加载时使用了合并语句product_target
......但没有得到。有人可以调查一下吗?
解决方案
假设表上的主键是productId
insert into product_target (
productId,
productName,
productStatus,
productType,
productDesc
)
select
productId,
productName,
productStatus,
productType,
productDesc
from product_source SRC
WHERE NOT EXISTS (SELECT * FROM product_target TGT
WHERE TGT.productID = SRC.ProductId);
注意:像这样插入和选择时,您应该始终使用列列表。
在我看来:
不要使用临时表来存储您插入的内容。这是多余且过于复杂的,因为您已经知道目标表中的内容,所以为什么要将其存储在另一个单独的表中
我建议您不要使用 SSIS 来执行此操作。如果源表和目标表位于同一个数据库中,则 T-SQL 解决方案通常是最好的,除非您有更广泛的要求(如日志记录、配置、复杂调度、大量表等)。SCD 组件对于大型数据集效率低下(对于几千条记录没问题,但不要养成使用它的习惯)。此外,SCD 组件是一个“破坏性向导”——它每次都会删除并重新创建流。查找组件也比 T-SQL 效率低。
推荐阅读
- debugging - Visual Studio Code - 使用 Chrome 进行调试 - 断点在开始时运行,而不是在遇到时
- python - 在 SQLAlchemy 中插入数据库(db_session 不工作)后查询失败
- javascript - VueJs - 在重定向到页面之前获取数据
- excel - VBA .End(xlDown) 在空白单元格处停止
- modelica - Dymola中求解DAE的过程
- c++ - collect2.exe:错误:ld 返回 1 退出状态没有创建 DLL
- pine-script - 有人可以帮我将以下策略转换为学习吗
- puppeteer - 为什么有时不使用 puppeter 收集信息?
- java - 如何在一个简单的 Java 计算器程序中使“RESULT”代表先前的结果(双变量)?
- c# - 如何在 ASP.NET Core 3.1 中使用 EF Core Cosmos 提供程序