根据另一个表中的更改更新,插入和删除表中的行

时间:2016-07-15 05:31:09

标签: sql sql-server

我有表A

ID  |  Address         | Field1 | Field2 | etc  
1   | 1 Smith St       | a      |  sd    | sdf
2   | 2 Smith St       | b      |  sf    | ff

我创建了另一个表B,其中只包含ID和地址以及2个用于纬度和经度的额外字段,我用一个单独的脚本填充

ID  | Address          | Lat    | Long
1   | 1 Smith St       | 20.23  | 110.34
2   | 2 Smith St       | 18.34  | 112.43

我想做两件事。

  1. 根据ID字段检查表A中的新记录并插入ID,将表B作为新行的地址(重要)
  2. 检查表A中已存在于表B中的记录的地址字段的更改并更新它们并清除表B中的纬度/经度值(如果地址已更改(不重要但很好)
  3. 表A使用Drop / Create进行更新,因此我不需要监听更改,我只是在寻找可以执行其中一个或两个的更新/插入查询。也可以是2个单独的查询。

    更新 我已经根据以下帖子解决了第一部分,sql insert rows from another table based on condition抱歉,我认为我已经搜索了足够的答案。仍不确定如何进行第二部分。使用SQL Server 2014来解决注释。以下为我处理第一部分。如何更新TableB中TableB.ID = TableA.ID但地址字段不同的行?

    INSERT INTO TableB (ID, ADDRESS)
    SELECT ID, ADDRESS
      FROM TableA t
     WHERE NOT EXISTS
    (
      SELECT * 
        FROM TableA
       WHERE ID = t.ID
    )
    

1 个答案:

答案 0 :(得分:0)

注意 - 以下所有代码均适用于MS-SQL,因为您没有指定。

根据ID检查表A中不在表B中的新记录,并将它们插入TableB

Insert Into TableB (ID, Address)
Select A.ID, A.Address
From TableA A
    Left Join TableB B on B.ID = A.ID
Where B.ID is null;

第2部分 - 更新TableB地址并清除lat,如果Id匹配但地址不同

Update B set Address = A.Address, Lat = NULL, Long = NULL
From TableB B
    Inner Join TableA A on A.ID = B.ID
Where A.Address <> B.Address;