【问题标题】:SQL: INSERT INTO table(...) VALUES (...) with data retrieved from other tablesSQL: INSERT INTO table(...) VALUES (...) 与从其他表中检索的数据
【发布时间】:2020-03-26 18:25:12
【问题描述】:

感谢您的光临。我知道基本的 SQL 语法,但似乎找不到完成这项任务的方法。

我需要创建一个存储过程,将数据从一个表插入另一个表,同时从许多其他表中检索数据。假设我有这些带有列的表:

  1. users

    • 名称(varchar)
    • sub_id (int)
    • dub_id (int)
  2. tmp_users

    • 名称(varchar)
    • 子名称(varchar)
    • dub_name (varchar)
  3. subs

    • id (int)
    • 名称(varchar)
  4. dubs

    • id (int)
    • 名称(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,
)

在措辞中,我需要将来自tmp_users 的所有行插入users,以保留col tmp_users.name,但检索基于*_name 列的所有其他表的传入ids。我应该如何处理这项任务?

【问题讨论】:

  • 有 两种 形式的 INSERT 语句.. INSERT ... VALUES 和 INSERT ... SELECT ... 看起来您想要第二种形式,它不使用 VALUES 关键字...首先编写一个 SELECT 语句,该语句返回要插入的行集,然后对其进行测试。然后你可以在 SELECT 前面加上INSERT INTO foo (fee, fi, fo, fum)

标签: mysql sql database sql-insert


【解决方案1】:

你好像在找the INSERT ... SELECT syntax:

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 查询,看看会插入什么。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2011-11-09
    • 2012-07-06
    • 2023-02-09
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多