我正在尝试将一些数据从两个表迁移到一个新表中,并且很难弄清楚如何执行此操作。
数据:
table fh rows: A, B, C, X, Y
table fhgb rows: B, C
table gvsi (currently empty) rows: A, X, Y
A is unique, and B+C is unique
完成后,表格gvsi应该包含fh中的所有行,其中X = value且该行不在fhgb中。
这是向gvsi的一次性数据迁移,因此性能不是很大。 fh有3600万行,我关心的是1200万行(其中X =值)。 fhgb有1000万行。我期待gvsi在完成时包含大约200万行(12mil-10mil)。
我用谷歌搜索并尝试了许多东西,但无法获得任何工作(加入,子查询等)任何人都可以帮我弄清楚如何做到这一点?
答案 0 :(得分:1)
INSERT INTO `gvsi` (A, X, Y)
SELECT A, X, Y
FROM fh
WHERE X = 'value'
AND ( fh.B NOT IN (SELECT DISTINCT B FROM fhgb)
AND fh.C NOT IN (SELECT DISTINCT C FROM fhgb)
);
应该这样做。
答案 1 :(得分:0)
1步
INSERT INTO gvsi
SELECT fh.a, fh.x, fh.y FROM fh
WHERE fh.x = value AND NOT EXISTS
(SELECT 1 FROM fhgb WHERE fh.b = fhgb.b AND fh.c = fhgb.c);
2个步骤:
DELETE FROM fh WHERE EXISTS
(SELECT 1 FROM fhgb WHERE fh.b = fhgb.b AND fh.c = fhgb.c);
INSERT INTO gvsi SELECT fh.a, fh.x, fh.y from fh WHERE fh.x = value;
第一个更安全,因为最后,如果你对结果不满意,你可以重复一下。但是,由于条件的原因,它可能会更慢。
答案 2 :(得分:0)
当你使用简单的select insert语句执行它并且在一个步骤中将两个表联合起来时,它看起来很容易和复杂。
insert Into 3d_Table ( column1, column2, column3)
select column1, column2, column3
(
select column1, column2, column3
from 2d_table
union
select column1, column2, column3
from 2d_table
)
如果这有帮助,请尝试
答案 3 :(得分:0)
我们的DB人在2分钟内得出答案:
INSERT INTO gvsi (A, B, X, Y)
SELECT fh.A, fh.B, fh.X, fh.Y
FROM
f_h fh
LEFT OUTER JOIN f_h_g_b fhgb ON fh.A=fhgb.A and fh.B=fhgb.B
WHERE fhgb.A IS NULL
这并不是说这些答案中的一些不起作用,但是这个答案首先尝试了。谢谢你看着它。我也应该尝试其他一些答案,看看它们是否有效以及它们是否能更快地运作。