繁体   English   中英

SQL:根据同一表中的匹配模式更新列

[英]SQL: Update columns based from a matched pattern in a same table

所以我有一个表“帐户”。 下面的条目都在同一表中。 我需要根据匹配的模式更新条目。 注意,除了下划线之后,Id具有相同的模式。

旧帐户状态将变为非活动状态。 对于新帐户,其状态将变为活动状态,并且其电子邮件将被更新为与ID模式匹配的旧帐户中的电子邮件。

另外,如果有新帐户具有相同的模式,例如X65423_KEL和X65423_KEL1,则两个条目的电子邮件列仍将基于X65432_REL中存储的内容进行更新。

仅供参考:条目已经存储在表中。 因此,我只需要更新条目即可。 图片在这里

根据OP的评论“您将了解它们的状态。在更新之前,旧帐户处于活动状态,新帐户处于非活动状态。这有点像一次性更新脚本” ,因此看起来很简单:

UPDATE YourTable
SET [Status] = CASE [Status] WHEN 'Active' THEN 'Inactive'
                             WHEN 'Inactive' THEN 'Active'
                             ELSE [Status] END;

这样会将每个非活动帐户更改为活动帐户,并将每个活动帐户更改为非活动帐户。 如果它们的status不同,则它们将保持不变。

我不确定您的“帐户”表有多大,或者是否需要更新其他列。 但是给定您的数据集,一种方法是提取活动数据,然后将其应用于新帐户一次,然后应用于旧帐户一次。 如:

CREATE TABLE #Accounts(ID varchar(10), email varchar(50), Status varchar(10))


INSERT INTO #Accounts VALUES('X65423_REL','test@gmail.com','Active')
INSERT INTO #Accounts VALUES('X32562_LET','test2@gmail.com','Active')
INSERT INTO #Accounts VALUES('X65423_KEL','default@gmail.com','Inactive')
INSERT INTO #Accounts VALUES('X32562_OTK','default@gmail.com','Inactive')



SELECT ID, LEFT(ID, charindex('_', ID) - 1) LK_ID, Email
INTO #LookUp
  from #Accounts
  WHERE Status = 'Active'

UPDATE #Accounts
SET email = t2.email, Status = 'Active'
from #Accounts t1
INNER JOIN  #LookUp t2 on  LEFT(t1.ID, charindex('_', t1.ID) - 1) = t2.LK_ID
where t1.Status <> 'Active'

UPDATE #Accounts
Set Status = 'Inactive'
from #Accounts t1
INNER JOIN #LookUp t2 on t1.ID = t2.ID

实际上,可以在单个查询中完成。
MySQL 5.7.24上测试

UPDATE accounts,
(
  SELECT email as old_email FROM accounts
  WHERE status = 'active'
) as temp
SET email = temp.old_email, 
    status = (SELECT IF(status = 'active', 'inactive', 'active'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM