编写 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_id
和Owner_username
列
【讨论】:
以上是关于编写 SQL 语句通过 join id 查找行,并将连接行中的值插入到父表中的主要内容,如果未能解决你的问题,请参考以下文章
SQL语句中的join只能与on连用吗?有没有只用join的?举个例子行吗?