gpt4 book ai didi

mysql - 根据复合主键的值读取增量数据

转载 作者:行者123 更新时间:2023-11-29 06:38:42 25 4
gpt4 key购买 nike

我有一个 OLTP(源),数据必须以增量方式从其中移动到 DWH(目标)。源表在 Loan_id、AssetID 上有一个复合主键,如下所示。

LOAN_ID, ASSETID, REC_STATUS
'12848','13170', 'F'

如果它是单个列主键,那么我将检查目标处列的最大值,然后从源中读取主键值大于目标处最大值的所有记录,但是因为它是复合主键,所以这是行不通的。

知道如何使用 T-SQL 查询来完成此操作吗?

规范:源是 MYSQL DB,目标是 MSSQL 2012。连接是使用链接服务器进行的。

最佳答案

您可以尝试一些方法。处理链接服务器并且不知道该设置的细节以及数据量和性能可能是一个问题。

如果您不担心现有记录的更改或删除,简单的左外连接将获取尚未插入到目标的所有记录:

SELECT          [s].[LOAD_ID]
, [s].[ASSETID]
, [s].[REC_STATUS]
FROM [LinkedServer].[Database].[schema].[SourceTable] [s]
LEFT OUTER JOIN [DestinationTable] [d]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHERE [d].[LOAN_ID] IS NULL;

如果您担心更改,您仍然可以使用左外部并在目标中查找 NULL 或字段值的差异,但随后您需要额外的更新语句。

SELECT          [s].[LOAD_ID]
, [s].[ASSETID]
, [s].[REC_STATUS]
FROM [LinkedServer].[Database].[schema].[SourceTable] [s]
LEFT OUTER JOIN [DestinationTable] [d]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHERE [d].[LOAN_ID] IS NULL --Records from source not in destination
OR (
--This evaluates those in the destination, but then checks for changes in field values.
[d].[LOAN_ID] IS NOT NULL
AND (
[s].[REC_STATUS] <> [d].[REC_STATUS]
OR [s].[SomOtherField] <> [d].[SomeOtherField]
)
);

--The above insert into some landing or staging table on the destination side and then you could do a MERGE.

如果我们需要担心删除。一条记录已从源中删除,并且您不再希望它出现在目标中。翻转左侧外侧以查找目标中不再位于源中的记录:

DELETE [d]
FROM [DestinationTable] [d]
LEFT OUTER JOIN [LinkedServer].[Database].[schema].[SourceTable] [s]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHERE [s].[LOAD_ID] IS NULL;

您可以尝试使用合并来完成所有这些操作。尝试通过链接服务器进行合并,或将所有源记录带到陆地/阶段表中的目的地,然后在那里进行合并。下面是尝试通过链接服务器的示例。

MERGE [DestinationTable] [t]
USING [LinkedServer].[Database].[schema].[SourceTable] [s]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHEN MATCHED THEN UPDATE SET [REC_STATUS] = [s].[REC_STATUS]
WHEN NOT MATCHED BY TARGET THEN INSERT (
[REC_STATUS]
)
VALUES ( [s].[REC_STATUS] )
WHEN NOT MATCHED BY SOURCE THEN DELETE;

在处理合并时,您需要注意以下语句:

WHEN NOT MATCHED BY SOURCE THEN DELETE;

如果您不处理整个记录集,您可能会丢失目的地中的记录。例如,您已经限制了从源提取到临时表中的结果集,现在您将临时表与最终目标合并,除此之外的任何内容都将在目标中删除。您可以通过使用 CTE 限制您的目标来解决这个问题,Google:“合并到 cte 作为目标”。也就是说,如果您有可以过滤的日期。

如果您有日期列,那总是很有帮助,尤其是在插入或更新新记录时的某种更改/更新日期列。然后,您可以过滤源,仅显示您关心的记录。

关于mysql - 根据复合主键的值读取增量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52626486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com