我有一张桌子A和一张桌子B。

表A是从表B创建的(以及其他一些表连接操作)。
表A的所有列都是表B中列的子集。

表A和表B中有一列称为check_sum。这基本上是一个计算列,如果任何列值发生变化,那么check_sum(计算值)也会发生变化。
例如:

Table A ( schema ):
cust_id ( pk ), cust_name, cust_location, check_sum ... other columns ( no need to worry about them )

Table B ( schema ) :
cust_id ( pk ), cust_name, cust_location, check_sum


最初,表B和A具有如下条目:

Table A:  ( sample record )
1, John, USA, abc222abc, ... other columns

Table B:  ( sample record )
1, John, USA, abc222abc


现在假设约翰将他的国家/地区更改为英国,然后表A中的相应条目如下所示

Table A:  ( sample record )
1, John, UK, checkSumChanged, ... other columns


现在,我需要相应地更新我的表B,这样就应该将其作为英国而不是约翰在美国的位置。
列校验和在这里很有用,因为如果任何列更改,表A中的值都会更改。

这就是我坚持的部分。无法仅将表A的“ CHANGED”行更新到表B。我在下面有以下查询。它正在更新所有行,而不仅仅是更新的行。

这是查询。

UPDATE tableB
SET
    tableB.cust_name = tableA.cust_name,
    tableB.cust_location = tableA.cust_location,
    tableB.check_sum = tableA.check_sum
FROM
    tableA inner join tableB
    on tableA.cust_id = tableB.cust_id
    and tableA.check_sum != tableB.check_sum


任何想法或建议,我该如何更正我的查询以仅更新已更改的记录。

提前致谢!!!

最佳答案

无需加入即可:

update B
SET cust_name = a.cust_name, checksum = a.checksum, cust_location = a.cust_location
FROM a
WHERE a.custid = b.custid AND a.checksum != b.checksum;

10-07 17:01