2011-05-13 20 views
1

Table_Aに大量の行を挿入しようとしています。 Table_Aは、Table_B.B_IDを指すB_ID列を含む。INSERT INTO..SELECTのヘルプ

表Bには、Table_B.B_ID(主キー)とTable_B.Nameの2つの列しかありません。

私はB_ID以外のすべてのTable_Aフィールドの値を知っています。私は対応する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

+0

1と 'foo'はPHPのものです – babonk

答えて

1

私はIdsが環境で異なって本番環境にスクリプトを展開するときに、このようなことを行うために持っていた:

は、ここで私が何をしたいの擬似コードのバージョンです。

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 

:あなたはこれを使用することができます

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

(SELECT ...)

から来る:それ以外の場合は、おそらく値が場合は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'がありません –

+0

@ypercube doh。固定のお礼 –

0

を入力する方が簡単ですそうでない場合は、それらをテンポラリテーブルに格納してから、(SELECT ...)の代わりにTemporaryTableを使用して上記を使用します。

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

+0

@babonk:どういう意味ですか? –

+0

"値が...(SELECT ...)から来た場合。" B_IDのみ選択から来る(ここでは「A」と「B」に基づいて) – babonk