2011-05-13 118 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