【问题标题】:MySQL: Copy values from one column to another columnMySQL:将值从一列复制到另一列
【发布时间】:2021-12-12 20:00:19
【问题描述】:

我有一个有 7 列的表,要求是复制或复制特定步骤的 originalid,其值为 'convert' 到 id 列。下面是示例表和预期结果。提前谢谢你。

Create table table1 (id varchar(35), originalid varchar(35), dte datetime, step varchar(35), itemno varchar(35), originalid2 varchar(35));
INSERT INTO table1 VALUES ('111111111111','111111111111','2019-01-07 02:22:30','null','null','null'),
('111111111111','111111111111','2019-02-09 02:22:30','null','null','null'),
('111111111111','111111111111','2019-03-11 02:22:30','repair','null','null'),
('111111111111','111111111111','2019-04-07 02:22:30','null','null','null'),
('0001','111111111111','2019-04-10 02:22:30','Convert','0001','111111111111'),
('0001','0001','2019-05-12 02:22:30','null','0001','0001'),
('0001','0001','2019-06-20 02:22:30','null','0001','0001'),
('0001','0001','2019-07-25 02:22:30','null','0001','0001'),
('0001','0001','2019-08-08 02:22:30','null','0001','0001'),
('0001','0001','2019-09-07 02:22:30','Completed','0001','0001');
                    

预期结果:

id ------------------originalid-------------Date---------------step
111111111111       |  111111111111 |2019-01-07 02:22:30|
111111111111       |  111111111111 |2019-02-09 02:22:30|
111111111111       |  111111111111 |019-03-11 02:22:30 |repair
111111111111       |  111111111111 |2019-04-07 02:22:30|
111111111111       |  111111111111 |2019-04-10 02:22:30|convert
111111111111       |  0001          |2019-05-12 02:22:30|
111111111111       |  0001          |2019-06-20 02:22:30|
111111111111       |  0001          |2019-08-08 02:22:30|completed
111111111111       |  0001          |2019-09-07 02:22:30|

【问题讨论】:

  • 只有一行step = 'convert'
  • 是的,它只有一行steps='Convert'。顺便说一句,我在示例表中为 itemno 和 originalid2 添加了新列。
  • 这些新列与问题有什么关系?
  • 它在我的示例数据中没有考虑到的表格部分,我认为可以用作参考。

标签: mysql mysql-workbench


【解决方案1】:

这里是使用 originalid 更新所有 id 的 sql,其中 step 是“convert”, limit 1 用于只选择step = 'convert' 所在的一行

update table1 set id =(select originalid from table1 where step = 'convert' limit 1)

select (select originalid from table1 where step = 'convert' limit 1) as id, originalid, dte, step from table1; 

【讨论】:

  • 在更新时使用LIMIT条件不是最佳实践,因为你永远不知道先获取哪一行,你应该在WHERE条件下更精确,否则你可能会使用过时的记录即通过活动记录删除。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • 我认为这行不通,因为stackoverflow.com/questions/4429319/…
  • @Cyber​​ 这个问题似乎暗示只有一个这样的行。如果没有,它不会提供如何选择要使用的指南。
  • @Cyber​​ 我们为简单的编码答案提供什么样的“支持信息”?链接没有这样说。
【解决方案2】:

UPDATE 中使用自联接

UPDATE table1 AS t1
CROSS JOIN table1 AS t2
SET t1.id = t2.originalid
WHERE t2.step = 'convert';

【讨论】:

  • 感谢您的回复。我会试试这段代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2016-03-15
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多