Sql server 从值为null的同一表中更新项

Sql server 从值为null的同一表中更新项,sql-server,database,duplicates,sql-update,Sql Server,Database,Duplicates,Sql Update,我有一个表成员,其中的条目是重复的,我想删除其中一个条目,但其中一个条目的某些列已更新,另一个条目的某些列已更新 所以我想做的是更新列,但其中值存在于1中,而在另一个列中为null或空,这样两行就完全相同了,并且我不会从中丢失任何数据 表结构: 样本数据 预期结果: 提前谢谢 附例: 试试这个 WITH t2 AS ( SELECT member_dob, member_name_en, member_age, nationality, MobileNumber FROM <<tab

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

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

表结构:

样本数据

预期结果:

提前谢谢

附例: 试试这个

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

假设你的组合主键是成员dob、成员name、成员age


似乎您希望查看成员名称,并从其记录中选取一个值,优先选择非null而非null。然后简单地聚合并使用MIN或MAX来选择这样的值

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;

请编辑您的问题,以包括相关表DDL、一些作为DML的示例数据和所需结果。@ZoharPeled done请检查主键是多个项目的组合键。这很奇怪。成员表的主键最好是成员名称或成员编号。我想我们在这里讨论的是一些事务表?应该有一个具有适当主键的真实成员表。您可以使用事务记录向上插入成员表。通过一个程序在数据中循环,或使用触发器,或通过一个按成员名称分组的查询,并为每个字段指定一个适当的聚合函数,例如maxMobileNumber。@ThorstenKettner没有其他人实际创建了这个没有主键的成员表,但transid是唯一的键以及定量卡id,member_id应该是唯一的,但是失败了;uid也应该是唯一的,但是它们的entries是重复的。因此,这不是members表,而是members表上的事务。我建议引入一个members表,因为您的数据库似乎缺少它。然后,要么完全删除事务表,要么给它一个触发器以自动填充成员表。u plz现在可以解释问题u fcd吗?如果移动号码字段包含空字符串,则可以使用..ISNULLNULLIFM1.MobileNumber,,M2.MobileNumber。。我做了,但我认为它是从同一个transid而不是我的条件中的另一个transid更新的。在M1.transid M2.transid上。让我们。不完全是一个解决方案,但这是一个解决方案。谢谢
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
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
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
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;