编写 SQL 语句通过 join id 查找行,并将连接行中的值插入到父表中

Posted

技术标签:

【中文标题】编写 SQL 语句通过 join id 查找行,并将连接行中的值插入到父表中【英文标题】:Write SQL statement to look up row by join id, and insert a value from the joined row into the parent table 【发布时间】:2022-01-09 22:41:24 【问题描述】:

我有一个名为Form 的表,其中包含一个链接到User 表的User_id

我想从用户表中提取用户名,并将其插入到一个新字段Form.ownersUsername。我不想自己手动生成插入语句,而是让它遍历所有字段并将值 Form.ownersUsername 设置为等于 User.username 的值。

我知道如何加入和选择表格,因此我使用以下语句选择了所有相关信息,但不确定下一步。

SELECT * FROM Form
LEFT JOIN User U ON Form.id = U.id;

谢谢

Form table
-----------------------------------------------------
| Form_id |  title  |  Owner_id  |  Owner_username  |
|    1    |    x    |      1     |      <null>      | 
|    2    |    y    |      1     |      <null>      | 
 ----------------------------------------------------

User table
------------------------
| User_id |  username  |
|    1    |   000001   |
|    2    |   000002   |
------------------------

供参考:我必须这样做,因为如果用户详细信息发生更改(例如,他们被提升),我的系统会创建一个新用户条目,因为我们需要在某个时间点知道用户的详细信息搜索时,我们要按强制号码搜索,而不是用户输入。

【问题讨论】:

请分享相关表格的样本数据和期望的结果,以便我们更好地理解。 请标记您的特定 RDBMS 所以你知道如何加入用户名,这就是你所需要的。实际上不要将名称存储在另一个表中,保持标准化。为方便起见,您可以使用连接查询创建视图。 你要求的不是一个好主意,而且绝对是一个反模式;考虑一下如果有人更新了一个表中的username 列会发生什么 - 现在您的数据相互矛盾,这是正确的吗?请改用 view 完成后,我将完全删除指向用户表的链接。链接该表是另一个开发人员的疏忽,因为用户的配置方式可能会导致搜索错误。 【参考方案1】:

听起来您只需要更新具有匹配用户 ID 的行

update f set
  f.Owner_username=u.username
from Form f
join [User] u ON = u.id = f.id;

这可能应该是一个 inner 连接,除非您希望将所有不匹配的行也更新为 NULL。

【讨论】:

【参考方案2】:

您可以使用 select 语句来定义要插入的值。这是一个例子:

INSERT INTO Form (Owner_id, Owner_username)
SELECT
    User_id,
    username
FROM User
WHERE id = 2

此查询将根据选择结果插入Owner_idOwner_username

【讨论】:

以上是关于编写 SQL 语句通过 join id 查找行,并将连接行中的值插入到父表中的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中的join只能与on连用吗?有没有只用join的?举个例子行吗?

如何从 SQL *PLUS 中的批量插入中查找失败的插入语句

sql怎么把两张表合并成一张

求SQL语句里面join的用法,求例子及讲解。

sql语句同表join写法

怎样编写SQL语句求平均成绩