Mysql SQL:将某些字段值复制到同一表中的另一条记录
我有一个表,其中大约有100条记录作为模板,超过10000条拷贝记录与原始记录反向引用。我需要从副本中相应的原始字段重新初始化副本中的字段,但无法找出为什么无法从子查询中引用外部字段 示例表(): 预期结果:Mysql SQL:将某些字段值复制到同一表中的另一条记录,mysql,sql,sql-update,Mysql,Sql,Sql Update,我有一个表,其中大约有100条记录作为模板,超过10000条拷贝记录与原始记录反向引用。我需要从副本中相应的原始字段重新初始化副本中的字段,但无法找出为什么无法从子查询中引用外部字段 示例表(): 预期结果: 1 no change 2 no change 3 string should change to 'original 1' 4 string should change to 'original 2' 5 string should change to 'original 2' 我尝试
1 no change
2 no change
3 string should change to 'original 1'
4 string should change to 'original 2'
5 string should change to 'original 2'
我尝试过的SQL:
update data as target set target.string=(select string from
(select string from data as source where source.id=target.originalid) as x);
错误:
Unknown column 'target.originalid' in 'where clause'
您收到该错误是因为子查询只能访问其直接父查询的数据。这意味着您的
选择字符串FROM(),因为x
知道目标。*
,但不知道子查询。但是,您也不能在单个查询中选择和写入同一个表
虽然可能有一种更奇特的方法来做这件事。。。我建议用此数据填充另一个表,然后重命名这两个表。您收到此错误,因为子查询只能访问其直接父查询的数据。这意味着您的
选择字符串FROM(),因为x
知道目标。*
,但不知道子查询。但是,您也不能在单个查询中选择和写入同一个表
虽然可能有一种更奇特的方法来做这件事。。。我建议用这些数据填充另一个表,然后重命名这两个表。如果您尝试以下SQL,您会发现它实现了您的目标(希望如此):
如果您尝试以下SQL,您会发现它实现了您的目标(希望如此):
╔════╦════════════╦════════════╗
║ ID ║ ORIGINALID ║ STRING ║
╠════╬════════════╬════════════╣
║ 1 ║ (null) ║ original 1 ║
║ 2 ║ (null) ║ original 2 ║
║ 3 ║ 1 ║ original 1 ║
║ 4 ║ 2 ║ original 2 ║
║ 5 ║ 2 ║ original 2 ║
╚════╩════════════╩════════════╝
╔════╦════════════╦════════════╗
║ ID ║ ORIGINALID ║ STRING ║
╠════╬════════════╬════════════╣
║ 1 ║ (null) ║ original 1 ║
║ 2 ║ (null) ║ original 2 ║
║ 3 ║ 1 ║ original 1 ║
║ 4 ║ 2 ║ original 2 ║
║ 5 ║ 2 ║ original 2 ║
╚════╩════════════╩════════════╝
比如:
UPDATE data d
JOIN
( SELECT id, data
FROM data
WHERE originalid IS NULL
) AS do
SET d.data = do.data
WHERE d.originalid = do.id;
类似于:
UPDATE data d
JOIN
( SELECT id, data
FROM data
WHERE originalid IS NULL
) AS do
SET d.data = do.data
WHERE d.originalid = do.id;
这就是您想要的,以便我可以将其转换为答案吗?这就是你想要的,我可以把它转换成答案吗?
update data d2 join data d1 on d1.Id = d2.OriginalId
set d2.data = d1.data;
UPDATE data d
JOIN
( SELECT id, data
FROM data
WHERE originalid IS NULL
) AS do
SET d.data = do.data
WHERE d.originalid = do.id;