从同一个表中更新值,其中值为null

时间:2017-01-16 06:38:52

标签: sql-server database duplicates sql-update

我有一个表成员,他们是重复的条目,我想删除其中一个,但是其中一个条目有一些列更新,另一个有其他一些。

所以我想做的是更新,但是值存在于1中的列和null或另一个中为空,以便两行完全相同,并且不会丢失任何数据。

表格结构:

CREATE TABLE [dbo].[membermobilenumberisnull](
[TransId] [bigint] NOT NULL,
[member_id] [int] NOT NULL,
[gendertype] [int] NULL,
[relationship_rs_code] [nvarchar](2) NULL,
[ration_card_id] [int] NOT NULL,
[uid] [nvarchar](16) NULL,
[member_dob] [datetime] NULL,
[member_name_en] [nvarchar](150) NULL,
[mother_name_en] [nvarchar](150) NULL,
[father_name_en] [nvarchar](150) NULL,
[member_age] [smallint] NULL,
[nationality] [nvarchar](150) NULL,
[MobileNumber] [nvarchar](20) NULL,
[IsUpdated] [bigint] NULL,
[UpdationDate] [datetime] NULL,
[IsDeleted] [bigint] NULL,
[DeletionDate] [datetime] NULL,
[CreationDate] [datetime] NULL,
[UpdatedBy] [nvarchar](250) NULL,
[DeletedBy] [nvarchar](250) NULL,
[MobileNumber1] [nvarchar](20) NULL,
[MobileFlag] [nvarchar](250) NULL
) ON [PRIMARY]

GO

示例数据

TransId     member_dob  member_name_en      member_age  nationality MobileNumber    UpdationDate    CreationDate
252238402   12-09-1985  PUSHPINDER SINGH    31          IND                         NULL            30-07-2016
252238403   12-09-1985  PUSHPINDER SINGH    31          IND         8626934377      NULL            30-07-2016
260846102   03-06-1984  VUDDHI DEVI         32          IND         9459209701      19-10-2016      14-08-2016
260846105   03-06-1984  VUDDHI DEVI         32          IND         NULL                            14-08-2016

预期结果:

TransId     member_dob  member_name_en      member_age  nationality     MobileNumber    UpdationDate    CreationDate
252238402   12-09-1985  PUSHPINDER SINGH    31          IND             8626934377      NULL            30-07-2016
252238403   12-09-1985  PUSHPINDER SINGH    31          IND             8626934377      NULL            30-07-2016
260846102   03-06-1984  VUDDHI DEVI         32          IND             9459209701      19-10-2016      14-08-2016
260846105   03-06-1984  VUDDHI DEVI         32          IND             9459209701      19-10-2016      14-08-2016

提前致谢

附加示例: enter image description here

3 个答案:

答案 0 :(得分:1)

假设您的合并PK为member_dob,member_name_en,member_age

UPDATE  M1
SET     M1.MobileNumber     =   ISNULL(NULLIF(M1.MobileNumber,''),M2.MobileNumber)
        ,M1.UpdationDate    =   ISNULL(M1.UpdationDate,M2.UpdationDate)
FROM    Member  AS  M1
    INNER JOIN  Member  AS  M2  ON  M1.TransId  <>  M2.TransId
                                AND M1.member_dob = M2.member_dob
                                AND M1.member_name_en = M2.member_name_en
                                AND M1.member_age = M2.member_age

答案 1 :(得分:0)

试试这个

WITH t2 AS (
SELECT member_dob, member_name_en, member_age, nationality, MobileNumber
FROM <<table>>
WHERE MobileNumber IS NOT NULL
)
UPDATE t1
SET MobileNumber = t2.MobileNumber
FROM <<table>> t1 JOIN t2
ON t1.member_dob = t2.member_dob
AND t1.member_name_en = t2.member_name_en
AND t1.member_age = t2.member_age
AND t2.nationality = t2.nationality
WHERE t1.MobileNumber IS NULL

答案 2 :(得分:0)

似乎你想查看一个member_name_en并从其记录中获取一个值,而不是null而不是null。然后只需汇总并使用MINMAX来选择此值。

update m
  set member_dob = src.max_member_dob
    , member_age = src.max_member_age
    , nationality = src.max_nationality
      etc.
from membermobilenumberisnull m
(
  select 
    member_name_en,
    max(member_dob) as max_member_dob,
    max(member_age) as max_member_age,
    max(nationality) as max_nationality,
    etc.
  from membermobilenumberisnull
  group by member_name_en
) src on src.member_name_en = m.member_name_en;
相关问题