0

我有一个表,其中包含大约 100 条记录作为模板和超过 10000 条复制记录回溯到原始记录。我需要从相应的原始副本中重新初始化副本中的一个字段,但无法弄清楚为什么我不能从子查询中引用外部字段。

示例表(SQLFiddle 链接):

ID   OriginalID    String
----------------------------
1    NULL          original 1
2    NULL          original 2
3    1             copy of 1
4    2             copy of 2
5    2             another copy of 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'
4

5 回答 5

2
UPDATE data a
       INNER JOIN data b
          ON a.originalid = b.id
SET a.data = b.data

输出

╔════╦════════════╦════════════╗
║ ID ║ ORIGINALID ║   STRING   ║
╠════╬════════════╬════════════╣
║  1 ║ (null)     ║ original 1 ║
║  2 ║ (null)     ║ original 2 ║
║  3 ║ 1          ║ original 1 ║
║  4 ║ 2          ║ original 2 ║
║  5 ║ 2          ║ original 2 ║
╚════╩════════════╩════════════╝
于 2013-03-15T15:49:51.813 回答
1

您收到该错误是因为子查询只能访问其直接父查询的数据。意味着您SELECT string FROM () as x知道target.*,但不知道子查询。但是,您也不能在单个查询中选择并写入同一个表。

虽然可能有一种更好的方法来做到这一点......我建议用这些数据填充另一个表,然后重命名你的 2 个表。

于 2013-03-15T15:45:59.200 回答
1

如果您尝试以下 SQL,您应该会发现它实现了您的目标(希望如此):

UPDATE data
  SET String = c.String
  FROM data INNER JOIN data c ON c.ID = data.OriginalID
于 2013-03-15T15:47:54.153 回答
1
update  data d2 join data d1 on d1.Id = d2.OriginalId
set     d2.data = d1.data;
于 2013-03-15T15:50:08.210 回答
1

就像是:

 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;

SQLFiddle

于 2013-03-15T16:00:29.163 回答