在mysql 5.5中,假设我们有以下主表
Id Name Score
3 a 100
3 b 99
4 c 98
4 d 97
还有一个子表:
Id New_Id
3 1
3 1
4 2
4 2
理想的输出是输出表:
Id Name Score
3 a 100
3 b 99
4 c 98
4 d 97
1 a 100
1 b 99
2 c 98
2 d 97
mysql fiddle在这里可用
http://sqlfiddle.com/#!9/91c1cf/6号机组
在输出表中,
我们可以看到id=1与id=3共享相同的信息。同样地,
我们可以看到id=2与id=4共享相同的信息。
有没有什么简单的方法,例如“insert into…select”、“copy”和“update”等,我们可以将id=3的数据复制到id=1,然后
将数据从id=4复制到id=2?
下面的查询确实生成了理想的输出,但是在我们的数亿行中,具有适当索引的连接仍然非常缓慢。在只有几十亿行的情况下,由于没有足够的ram和/tmp文件夹空间,作业甚至会失败。我们正在将我们的系统从mysql升级到一个更容易结痂的地方。但是,我们需要确保mysql系统在过渡期的几个月内能够正常工作。任何2美分都将不胜感激!
SELECT Id, Name, Score FROM MAIN
UNION
SELECT d.New_Id AS Id, c.Name, c.Score FROM MAIN c
RIGHT JOIN SUB d
ON c.Id = d.Id;
1条答案
按热度按时间1u4esq0p1#
使用
INNER JOIN
而不是RIGHT JOIN
,因为您不需要非匹配行产生的空行。你可以用INSERT INTO ... SELECT
将这些新行添加到表中。而不是使用UNION
,只需在新表中插入两个:只要你有索引就行了
id
两个输入表中的列这应该尽可能有效。最后,当做大的
UNION
查询,使用UNION ALL
如果您知道没有需要合并的重复项。UNION
本身默认为UNION DISTINCT
,因此需要创建一个临时表来保存所有要扫描的重复结果。