Помощь с INSERT INTO..SELECT - PullRequest
       29

Помощь с INSERT INTO..SELECT

1 голос
/ 14 мая 2011

Я вставляю большое количество строк в Table_A. Таблица_A содержит столбец B_ID, который указывает на Table_B.B_ID.

Таблица 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

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Мне приходилось делать такие вещи при развертывании сценариев в производственной среде, где идентификаторы отличались в разных средах. В противном случае, вероятно, будет проще набрать идентификатор

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 голосов
/ 14 мая 2011

Если значения:

(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

Если нет, вы можете вставить их во временную таблицу, а затем использовать приведенное выше, заменив (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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...