SQL Server 2008:有条件地更新 table 列

SQL Server 2008: updating table columns conditionally

我对 SQL 还是很陌生,所以请耐心等待。

为了简化我的问题,假设我有 2 个相同的人 tables attributes/fields 例如 ID,last_name,first_name,date_of_birth 、街道、城市、州、邮政编码。

我希望 table 2 根据 table 1 中的内容进行更新,但我希望保留自上次以来添加的 table 2 中的数据我从 table 刷新的时间 1.

它归结为两个我不知道如何转换为 SQL 查询的逻辑轨道:

  1. 更新 table 2 中为空的列
  2. (我不知道该怎么做)更新 table 2 中的列,包括覆盖现有数据,除非从 table 1 中的相应列进行覆盖用空值覆盖 table 2 中的数据。

提前致谢

更新

好的,所以 2 table 开始时是相同的:

Person table

然后,用户将更新 table 2,而 table 1 也会同时收到更新。

假设 ID 1 的名字和中间名在 table 2 中更新,而 ID 2 的中间名在 table 1 中更新。

Person table changes before update

所以现在,我正在尝试提出一个 SP,它将基于 table 1 并使用我上面描述的逻辑更新 table 2。

table2 中的每一列都应该被table1 中相应列中的数据覆盖,即使它覆盖了现有数据。所以'John'又会变成Rachel。我想为这种覆盖做的例外是 table 2 中的数据将被空值覆盖。

所以当 John 将被覆盖回 Rachel 时,William 作为 middle_name 应该保留在 table 2 中,因为 table 1 的 ID 为空值(编号 1) 我会 post 另一张所需输出的图片,但显然我还没有足够的声誉来 post 超过 2 个链接。所以这是我想要的文本输出

Person_2 更新后

ID|last_name|first_name|middle_name

1|阿迪|雷切尔|威廉

2|阿吉拉尔|理查德|杰弗里

3|...

好吧,我终于明白了。 这是我所做的。

如果有人有更有效的方法来做到这一点,我会洗耳恭听。谢谢

SELECT Person_2.id

  ,CASE WHEN Person_2.ID=Person_1.id 
           AND Person_2.last_name IS NULL 
               THEN Person_1.last_name 

           WHEN Person_2.ID=Person_1.id 
           AND Person_2.last_name IS NOT NULL 
           AND Person_1.last_name IS NULL
               THEN Person_2.last_name

           WHEN Person_2.ID=Person_1.id 
           AND Person_2.last_name IS NOT NULL 
           AND Person_1.last_name IS NOT NULL
               THEN Person_1.last_name                   

               END AS last_name  


  ,CASE WHEN Person_2.ID=Person_1.id 
           AND Person_2.first_name IS NULL 
               THEN Person_1.first_name 

           WHEN Person_2.ID=Person_1.id 
           AND Person_2.first_name IS NOT NULL 
           AND Person_1.first_name IS NULL
               THEN Person_2.first_name

           WHEN Person_2.ID=Person_1.id 
           AND Person_2.first_name IS NOT NULL 
           AND Person_1.first_name IS NOT NULL
               THEN Person_1.first_name                   

               END AS first_name  


  ,CASE WHEN Person_2.ID=Person_1.id 
           AND Person_2.middle_name IS NULL 
               THEN Person_1.middle_name 

           WHEN Person_2.ID=Person_1.id 
           AND Person_2.middle_name IS NOT NULL 
           AND Person_1.middle_name IS NULL
               THEN Person_2.middle_name

           WHEN Person_2.ID=Person_1.id 
           AND Person_2.middle_name IS NOT NULL 
           AND Person_1.middle_name IS NOT NULL
               THEN Person_1.middle_name                   

               END AS middle_name      

FROM Person_2 
   LEFT JOIN [Person_1]  ON Person_2.id=Person_1.id