如果表B中的列XYZ(校验和)发生更改,则从表B更新表A中的记录

时间:2015-07-24 17:00:27

标签: mysql sql postgresql rdbms greenplum

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

表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

现在让我们说John将他的国家/地区位置更改为英国,然后表A中的相应条目看起来像这样

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

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

这是我坚持的部分。无法仅更新表A到表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

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

提前致谢!!!

1 个答案:

答案 0 :(得分:2)

没有加入时这样做:

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;