SQL: INSERT INTO table (...) VALUES (...) с данными, полученными из других таблиц - PullRequest
1 голос
/ 26 марта 2020

Спасибо, что прошли мимо. Я знаю синтаксис basi c SQL и, похоже, не могу найти способ выполнить sh эту задачу.

Мне нужно создать хранимую процедуру, которая вставляет данные из одной таблицы в другую, извлекая данные из многих других. Предположим, у меня есть эти таблицы со столбцами:

  1. users

    • name (varchar)
    • sub_id (int)
    • dub_id (int)
  2. tmp_users

    • name (varchar)
    • sub_name (varchar)
    • dub_name (varchar)
  3. subs

    • id (int)
    • name (varchar)
  4. dubs

    • id (int)
    • name (varchar)

Переведенный в псевдокод, я должен сделать что-то вроде этого:

INSERT INTO users (name, sub_id, dub_id)
ALL ROWS FROM tmp_users VALUES (
    name = tmp_users.name, 
    sub_id = SELECT id FROM subs WHERE tmp_users.sub_name = subs.name,
    dub_id = SELECT id FROM dubs WHERE tmp_users.dub_name = dubs.name,
)

В формулировке мне нужно вставить в users все строки из tmp_users, чтобы сохранить столбец tmp_users.name, но получить афферентные id всех других таблиц на основе столбца *_name. Как мне подойти к этой задаче?

1 Ответ

4 голосов
/ 26 марта 2020

Похоже, вы ищете синтаксис INSERT ... SELECT :

INSERT INTO users (name, sub_id, dub_id)
SELECT 
    tu.name,
    s.id,
    d.id
FROM tmp_users tu
LEFT JOIN subs s ON s.name = tu.sub_name
LEFT JOIN dubs d ON d.name = tu.dub_name

. При этом все строки из tmp_users выводятся, затем попытайтесь восстановить соответствующие sub_id и dub_id. Для каждой строки, возвращаемой select, запись вставляется в users. Хорошая вещь в этом синтаксисе состоит в том, что вы можете сначала выполнить запрос select независимо, чтобы увидеть, что будет вставлено.

...