0

我正在尝试将一些数据从两个表迁移到一个新表中,并且很难弄清楚如何去做。

数据:

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=value)。fhgb 有 1000 万行。我预计 gvsi 完成后将包含大约 200 万行(12mil-10mil)。

我用谷歌搜索并尝试了很多东西,但没有任何工作(JOIN、子查询等)。谁能帮我弄清楚如何做到这一点?

4

4 回答 4

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)
    );

那应该这样做。

于 2013-01-18T14:27:45.413 回答
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;

第一个更安全,因为最后,如果你对结果不满意,你可以重复这件事。但是,由于条件的原因,它可能会更慢。

于 2013-01-18T14:30:33.553 回答
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

这并不是说其中一些答案不起作用,但这个答案是第一次尝试。感谢您查看它。我也应该尝试其他一些答案,看看它们是否有效,以及它们是否工作得更快。

于 2013-01-23T14:55:11.760 回答
0

好吧,当您使用简单的 select insert 语句并一步合并 2 个表时,它看起来既简单又复杂。

 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
  )

如果这对您有帮助,请尝试

于 2013-01-18T14:35:30.703 回答