Sql server 从值为null的同一表中更新项
我有一个表成员,其中的条目是重复的,我想删除其中一个条目,但其中一个条目的某些列已更新,另一个条目的某些列已更新 所以我想做的是更新列,但其中值存在于1中,而在另一个列中为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
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;