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

时间:2016-10-10 14:09:45

标签: sql sql-server-2008 case-when

我还是SQL的新手,所以请耐心等待。

为了简化我的问题,我们说我有两个相同的人员表,其中包含ID,last_name,first_name,date_of_birth,street,city,state,zip等属性/字段。

我希望根据表1中的内容更新表2,但我希望保留自上次从表1刷新以来添加的表2中的数据。

归结为两条逻辑轨道,我不知道如何转换为SQL查询:

  1. 更新表2中的列
  2. (这是我不知道该怎么做的)更新表2中的列,包括覆盖现有数据,除非表1中相应列的覆盖将覆盖表2中具有空值的数据
  3. 提前致谢

    更新

    好的,所以2个表开始相同:

    Person table

    然后,用户将更新表2,而表1也将在同一时间内收到更新。

    我们假设表1中更新了ID 1的名字和中间名,而表1中更新了ID 2的中间名。

    Person table changes before update

    所以现在,我正在尝试提出一个SP,它将根据表1更新表2并使用上述逻辑。

    表2中的每一列都应该被表1中相应列中的数据覆盖,即使它覆盖了现有数据。所以' John'将再次成为雷切尔。我想要覆盖的例外是当表2中的数据被空值覆盖时。

    因此,虽然John将被覆盖回Rachel,但作为middle_name的William应保留在表2中,因为表1的ID为空值(ID 1) 我会发布另一张所需输出的图片,但显然我还没有足够的声望发布超过2个链接。所以这是我想要的文本输出

    更新后的Person_2

    ID |姓氏| first_name的| middle_name

    1 |阿迪|雷切尔|威廉

    2 |咀|理查德|杰弗里

    3 | ...

1 个答案:

答案 0 :(得分:0)

好吧,我最终想通了。 这就是我所做的。

如果有人有更有效的方式做到这一点,我全都听见了。感谢。

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