比较表并识别新字段或已更改字段

时间:2011-09-29 10:44:30

标签: sql sql-server

SQL新手,希望比较stg和src表之间的字段。识别表之间的任何差异并指定“C”的交易状态以进行更改。任何新记录都将设置为“A”以进行添加。

STG_DM_CLIENT和SRC_DM_CLIENT

最好的方法是什么,最好是做一种形式的联合。不确定如何进行,欢迎任何协助。

3 个答案:

答案 0 :(得分:2)

您可以使用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 ...))

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我认为键上2个表的简单连接(我猜它是源目标表所以必须有一个公共密钥),所有其他属性都不同。当您需要加载缓慢变化的尺寸(SCD)时,这很常见。检查一下:How do I model data that slowly changes over time?