2011-05-13 254 views
1

我向Table_A插入大量的行。 Table_A包括指向Table_B.B_ID的B_ID列。帮助INSERT INTO..SELECT

表B只有两列:Table_B.B_ID(主键)和Table_B.Name。

我知道我插入的每个Table_A字段的值,除了B_ID。我只知道相应的Table_B.Name。那么如何将多行插入到Table_A中呢?

这里是什么,我想做一个伪版本:

REPLACE INTO Table_A (Table_A.A_ID, Table_A.Field, Table_A.B_ID) VALUES 
(1, 'foo', [SELECT B_ID FROM Table_B WHERE Table_B.Name = 'A'), 
(2, 'bar', [SELECT B_ID FROM Table_B WHERE Table_B.Name = 'B'),...etc 
+1

'1',''foo''等来自哪里?如果这些字段也可以从某个表中读取,那么可以使用联接来完成。 – mellamokb 2011-05-13 22:22:21

+0

1和'foo'来自PHP – babonk 2011-05-13 22:44:23

回答

1

我不得不到生产环境中的ID在不同的环境中部署脚本时,做这样的事情。否则,它可能更容易打出来的ID的

REPLACE INTO table_a (table_a.a_id, table_a.field, table_a.b_id) 
SELECT 1, 'foo', b_id, FROM table_b WHERE name = 'A' 
UNION ALL SELECT 2, 'bar', b_id, FROM table_b WHERE name = 'B' 
+0

您在'UNION ALL'后面缺少一个'SELECT'# – 2011-05-13 23:23:21

+0

@ypercube doh。固定感谢 – 2011-05-13 23:47:03

0

如果值:

(1, 'foo', 'A'), 
(2, 'bar', 'B'), 

来自(SELECT ...)

您可以使用此:

INSERT INTO Table_A 
    (A_ID, Fld, B_ID) 

SELECT Data.A_ID 
    , Data.Field 
    , Table_B.B_ID 
    FROM (SELECT ...) As Data 
     JOIN Table_B 
      ON Table_B.Name = Data.Name 

如果没有,你可以进去将它们留在临时表中,然后使用上述内容,用TemporaryTable代替(SELECT ...)

CREATE TABLE HelpTable 
    (A_ID int 
    , Fld varchar(200) 
    , Name varchar(200) 
    ) ; 

INSERT INTO HelpTable 
VALUES 
(1, 'foo', 'A'), 
(2, 'bar', 'B'), etc... 
; 

INSERT INTO Table_A 
    (A_ID, Field, B_ID) 
SELECT HelpTable.A_ID 
    , HelpTable.Fld 
    , Table_B.B_ID 
    FROM HelpTable 
     JOIN Table_B 
      ON Table_B.Name = HelpTable.Name 
; 

DROP TABLE HelpTable ; 
+0

只有'A'和'B'被选中 – babonk 2011-05-13 22:39:59

+0

@babonk:你是什么意思? – 2011-05-13 22:56:36

+0

“如果值...来自(SELECT ...)”。只有B_ID来自选择(基于'A'和'B') – babonk 2011-05-13 23:06:11