SQL的新手,想要比较stg和src表之间的字段。识别表格之间的任何差异并为变更指定“C”的交易状态。任何新记录都将设置为“A”进行添加。比较表并标识新的或更改的字段
STG_DM_CLIENT和SRC_DM_CLIENT
什么是做到这一点的最好办法,那会是最好做一个某种形式的联盟所有。不确定如何继续,欢迎任何帮助。
SQL的新手,想要比较stg和src表之间的字段。识别表格之间的任何差异并为变更指定“C”的交易状态。任何新记录都将设置为“A”进行添加。比较表并标识新的或更改的字段
STG_DM_CLIENT和SRC_DM_CLIENT
什么是做到这一点的最好办法,那会是最好做一个某种形式的联盟所有。不确定如何继续,欢迎任何帮助。
您可以通过使用NOT IN确定新的记录或NOT EXISTS
update STG_DM_CLIENT SET TransactionStatus = 'A' WHERE ID IN
(select Id from STG_DM_CLIENT
where Id not in (select Id from SRC_DM_CLIENT))
然后,您可以通过比较字段标识更改的记录:
update STG_DM_CLIENT SET TransactionStatus = 'C' WHERE ID IN
(select STG_DM_CLIENT.Id from STG_DM_CLIENT
join SRC_DM_CLIENT on SRC_DM_CLIENT.Id = STG_DM_CLIENT.Id
where (SRC_DM_CLIENT.Field1 != STG_DM_CLIENT.Field1
OR SRC_DM_CLIENT.Field2 != STG_DM_CLIENT.Field2 ...))
我想在2个表的简单连接在密钥上(我猜它是源目标表,所以必须有一个公共密钥),其他所有属性都不相同。这在您需要加载渐变尺寸(SCD)时非常常见。检查此:How do I model data that slowly changes over time?
update
[STG]
set
TransactionStatus = CASE WHEN [SRC].id IS NULL THEN 'A' ELSE 'C' END
from
STG_DM_CLIENT AS [STG]
left join
SRC_DM_CLIENT AS [SRC]
ON [STG].id = [SRC].id -- Or whatever relates the records 1:1
WHERE
[SRC].id IS NULL
OR [STG].field1 <> [SRC].field1
OR [STG].field2 <> [SRC].field2
OR [STG].field3 <> [SRC].field3
...
OR [STG].fieldn <> [SRC].fieldn
嗨,困惑的第一行 - WHEN [SRC] .id IS NULL然后'A'。当你声明client_code = null,然后A时,它将如何识别新的客户记录。请解释 - 可能会被误解?预先感谢您 – Nobody
如果您使用LEFT JOIN数据,即使右表中没有记录,您也可以获得左表上的所有记录。这意味着如果记录存在于STG中但不存在于SRC中,则所有SRC字段都将为NULL。因此,如果SRC.id为空,则它不存在于SRC中,并且要添加STG中的记录。 – MatBailie