Sql 基于另一列将列值设置为外键
我正在使用SQL Server,并已将数据从Excel文件导入到我的表中 我的表格包括:Sql 基于另一列将列值设置为外键,sql,sql-server,Sql,Sql Server,我正在使用SQL Server,并已将数据从Excel文件导入到我的表中 我的表格包括: BHU概述(外键表) BHU设备(主键表) 我有不同类型的设备,希望将其拆分为自己的表BH_设备,并将其链接到主表BH_概览 我创建了表并进行了约束,但是,当数据导入到表中时,我刚刚将设备名称存储在BH_概览表中的“设备”列中,该列未链接到BH_设备 我想知道如何根据BH_概览表中设备列中的内容更新equipmentId列,以匹配BH_设备表中的Id 您可以看到,我已经为工厂区域和责任设置了外键,这是通
- BHU概述(外键表)
- BHU设备(主键表)
BH_设备
,并将其链接到主表BH_概览
我创建了表并进行了约束,但是,当数据导入到表中时,我刚刚将设备名称存储在BH_概览
表中的“设备”列中,该列未链接到BH_设备
我想知道如何根据BH_概览
表中设备列中的内容更新equipmentId
列,以匹配BH_设备
表中的Id
您可以看到,我已经为工厂区域和责任设置了外键,这是通过update语句手动完成的,因为只有几个外键需要链接,但与设备相关的BH_设备
表中有291种类型
我已经尝试过更新和内部连接,但是我的头脑还没有完全清醒过来。抱歉,如果我用了一种糟糕的方法,对SQL来说是比较新的,所以请说明是否有更简单的方法,或者之前是否有人问过这个问题,请链接,我会看一看
更新:
首先,您应该让表
BHU概述中的Equipment
列的内容与表BHU Equipment
中的列内容匹配
to get this equipment and the number of time they exist, use the following SQL statement
然后通过下面的SQL语句,在表BH_OverView
update BH_OverView
set equipmentId = (select id from BH_Equipment
where BH_Equipment.equipment=BH_OverView.Equipment)
验证表BH_概览
中equipmentId
的内容后,您可以通过以下方式从表BH_概览
中删除列Equipment
alter table BH_OverView drop column Equipment
我使用的是标准SQL,它可以在大多数数据库上运行
根据您的评论
你收到了一条错误消息
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
选择设备、计数(id)
来自BHU设备
按设备分组
计数(id)>1
另一个答案很好,但对于SQL Server,您可以通过连接直接更轻松地进行更新:
更新o
设置设备id=e.id
来自伯克希尔哈撒韦大学概览
在e设备=o设备上连接BH_设备e;
这种粗糙的语法也适用于Postgres、MySQL/MariaDB和更高版本的SQLite。SQL Server、MySQL、Postgres您可以通过joinHi@nour-allah-hussein更新。我尝试过这种语句,但它返回了错误消息,如下所示:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。我已在答案中添加了我的注释。谢谢您的回复。我已尝试运行此语句,但出现以下消息:请参阅顶部更新的问题所附的图片。根据数据库版本,此语句对我是否有效。虽然我不得不在join之后添加一个ON语句。很抱歉,where
应该是ON
下面的两个解决方案都应该面临相同的错误消息,子查询返回了多个值。当子查询在=、!=、=或者,当子查询用作表达式时。
但是您在问题中甚至在注释中都没有提及就更正了它。你应该清楚。
delete one of the repeated rows, then the error message will not exist.