假设我有两个BTREE索引表具有相同的行数但不必共享数据,我想将一列中的值从一个表复制到另一个表中。我看过other个问题' answers关于SELECTing涉及为两个表生成顺序ID,然后基于将这些ID匹配在一起执行一些JOIN操作。例如(来自第一个答案):
select result1.title1, title1.age1,result2.title2, title2.age2 from
(select @i:=@i+1 AS rowId, title1, age1 from tab1,(SELECT @i:=0) a) as result1 ,
(select @j:=@j+1 AS rowId,title2, age2 from tab2,(SELECT @j:=0) a ) as result2
where
result1.rowId = result2.rowId; #sic.
但是,我有两个问题:
UPDATE (SELECT (@x:=@x+1), title1 FROM title1,(SELECT @x:=0) a ) INNER JOIN...
的东西)。 O(n^2)
时间。如果首先生成虚拟ID,则会出现这种情况,然后JOIN
的每次运行都需要对一个或两个表进行线性搜索。是这样的吗?如果是这样,有没有更快的方法呢?例如,请考虑以下两个表:
CREATE TABLE t1 (
id INT NOT NULL PRIMARY KEY,
v INT
);
INSERT INTO t1 VALUES
(1, 3),
(3, 4),
(25, 7);
CREATE TABLE t2 LIKE t1;
INSERT INTO t2 VALUES
(6, 150),
(9, 143),
(14, 175);
假设我想将v
中的t2
值替换为一个查询中t1
中的t1
值,以便mysql> SELECT * FROM t1;
+----+------+
| id | v |
+----+------+
| 1 | 150 |
| 3 | 143 |
| 25 | 175 |
+----+------+
3 rows in set (0.00 sec)
变为:
{{1}}
我该怎么做?
答案 0 :(得分:0)
经过大量测试后,我认为我找到了一个非常可行的解决方案。如果源表上有顺序ID,则可以使用以下[无可置疑的有点不寻常]查询将这些值相对快速地复制到目标表(特别是如果源表为ENGINE=MEMORY
):
UPDATE t1 CROSS JOIN (SELECT @x:=0) a
SET t1.v=(@x:=@x+1)+(SELECT v FROM t2 WHERE id=@x)-@x;
SELECT v...
语句的开销非常重要,但它会大大减慢查询速度。