Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于另一列将列值设置为外键_Sql_Sql Server - Fatal编程技术网

Sql 基于另一列将列值设置为外键

Sql 基于另一列将列值设置为外键,sql,sql-server,Sql,Sql Server,我正在使用SQL Server,并已将数据从Excel文件导入到我的表中 我的表格包括: BHU概述(外键表) BHU设备(主键表) 我有不同类型的设备,希望将其拆分为自己的表BH_设备,并将其链接到主表BH_概览 我创建了表并进行了约束,但是,当数据导入到表中时,我刚刚将设备名称存储在BH_概览表中的“设备”列中,该列未链接到BH_设备 我想知道如何根据BH_概览表中设备列中的内容更新equipmentId列,以匹配BH_设备表中的Id 您可以看到,我已经为工厂区域和责任设置了外键,这是通

我正在使用SQL Server,并已将数据从Excel文件导入到我的表中

我的表格包括:

  • 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.