2016-11-29 41 views
1

我有一个数据表中的一些事情是这样的:SQL:从同桌的替代值更新表,如果缺少值

------------------------------------------------------- 
member id | Email_address | alternate_Email_Address 
------------------------------------------------------ 
001  | [email protected] | [email protected] 
001  |    | [email protected] 
001  |    | [email protected] 
002  | [email protected] | [email protected] 
002  |    | [email protected] 

我想运行一个SQL将复制的电子邮件地址的所有地方所有alternate_Email_Address都是一样的。

运行SQL后,我想表是这样的:

------------------------------------------------------- 
member id | Email_address | alternate_Email_Address 
------------------------------------------------------ 
001  | [email protected] | [email protected] 
001  | [email protected] | [email protected] 
001  | [email protected] | [email protected] 
002  | [email protected] | [email protected] 
002  | [email protected] | [email protected] 
+0

我删除了必要的标签。我也删除了mysql和sql-server标签,因为你没有使用两者。请仅添加您实际使用的数据库的标签。 –

+1

请用您真正使用的数据库标记您的问题。另外,最后一行如何得到“ss.gmail.com”? –

+0

你是说你想删除地址不一样的所有行吗? –

回答

2

如果我理解你想要什么,然后使用ANSI标准SQL的方法是:

update t 
    set email_address = (select max(t2.email_address) 
         from t t2 
         where t2.alternate_Email_Address = t.alternate_Email_Address and 
           t2.email_address is not null 
         ) 
    where email_address is null; 
+0

非常感谢......它按预期工作....你拯救我的一天:-) – Sujoy

0
UPDATE <TABLE> 
SET email_address = 
     (SELECT email_address 
     FROM <TABLE> lu 
     WHERE lu.alternate_email_address = <TABLE>.alternate_email_address 
       AND (email_address IS NOT NULL AND length(lu.email_address) > 1) limit 1) 
WHERE email_address IS NULL 

如果它是空字符串,则将其替换为WHERE email_address = "",而不是NULL。请致电alternate_email_address。出于性能原因,如果可能的话,使用limit 1而不是聚合函数。