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

时间:2018-11-30 12:24:55

标签: sql sql-server

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

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

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

仅供参考:条目已存储在表格中。因此,我只需要更新条目即可。 Image here

3 个答案:

答案 0 :(得分:1)

基于OP的评论“您将了解其状态。在更新之前,旧帐户处于活动状态,新帐户处于非活动状态。这有点像一次性更新脚本” ,这似乎是因此很简单:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

实际上可以在单个查询中完成。
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'))