Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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 在WHERE中使用LIKE更新表列_Sql_Sql Update_Subquery_Where_Sql Like - Fatal编程技术网

Sql 在WHERE中使用LIKE更新表列

Sql 在WHERE中使用LIKE更新表列,sql,sql-update,subquery,where,sql-like,Sql,Sql Update,Subquery,Where,Sql Like,我有一个tableENTITY,需要根据IDFUNNCODE进行更新,但IDFUNNCODE在另外两个TableFrom JOINT-then-to POSITION之间链接 并且与数据的可附加位置无关。我可以绑定的唯一参数是NEORSD表和position表之间的position名称。当我将LIKE语句放入where子句时,我得到一个错误作为回报。如果有人能给我指出正确的方向,我将不胜感激 表: NEORSD:包含范围信息和“位置名称=标记号” 实体:需要更新并接受范围信息代码 JOINT:保

我有一个tableENTITY,需要根据IDFUNNCODE进行更新,但IDFUNNCODE在另外两个TableFrom JOINT-then-to POSITION之间链接 并且与数据的可附加位置无关。我可以绑定的唯一参数是NEORSD表和position表之间的position名称。当我将LIKE语句放入where子句时,我得到一个错误作为回报。如果有人能给我指出正确的方向,我将不胜感激

表: NEORSD:包含范围信息和“位置名称=标记号”

实体:需要更新并接受范围信息代码

JOINT:保存名为posfuncode的funcode和相应的POSCODE

位置:包含POSCODE和“POSITION name=POSID”

UPDATE ENTITY
SET
 RANGE0 = (
 SELECT RANGE0 
 FROM NEORSD_1199 
 WHERE Tag_No like ('%PIT%'))

WHERE
FUNCCODE = (
SELECT POSFUNCCODE 
FROM JOINT 
WHERE POSCODE = (
SELECT POSCODE 
FROM POSITION 
WHERE POSID like ('%PIT%'))

如果NEORSD_1199有多行带有类似“%PIT%”的标记,则应使用哪个NEORSD_1199.RANGE0值来更新ENTITY.RANGE0

这是SQL数据库引擎的问题

为了更好地理解,请反向阅读SQL:

首先,您将从位置表中获得每个位置代码的列表,位置ID类似于“%PIT%”。这可能是一个代码,也可能是一百个代码

然后从关节表中获取每个位置函数代码,位置代码位于刚刚收集的位置代码列表中。再一次,可能是一个,可能是一百个

然后,您将从NEORSD1199表中获得一个范围为0的所有值的列表,其中Tag_No类似于“%PIT%”。同样,这可以是一个值,也可以是一百个值的列表

然后,您将从实体表中获取每一行,其中函数代码位于您从上述关节表步骤2收集的位置函数代码列表中,并且您将这些行中的RANGE0更新为步骤3中捕获的值

问题在于,步骤3中返回的“值”可能是一个值列表。如果 NEORSD1199有四行,其中标记号类似于“%PIT%” e、 g.PIT01、PIT02、PIT03、APIT00,这些行中的每一行都有不同的
RANGE0,例如1、2、3、99,那么DB引擎应该使用这四个值中的哪一个来更新实体表行中的RANGE0?

感谢@SQLCliff提出的有助于找到解决方案的问题。我在NEORSD表中创建了一个ID列,创建了一个临时表,其中包含FUNCCODE和NEORSD中的范围之间的链接。然后,我使用连接更新了实体。如果需要,我可以在临时表的末尾插入where子句进行筛选。由于它是一个大规模更新,我不再需要where子句。我的大脑只是喜欢把事情变得比需要的复杂

with t as(
select f.funccode as funccode ,n.range0, n.range100 
from func as f 
join NEORSD_1199_With_Ranges_Updated as n on n.id = f.poscode or n.id =f.devcode
/* WHERE nessecrary ;P*/)

update entity
set 
range0 = t.range0,
range100 = t.range100
from entity as e
join t on e.funccode = t.funccode

你的错误是什么?子查询在两端返回了多个值。。。。同样的错误。。实际上3个阶段你在哪个数据库上?在postgres上,您可以使用@giorgiga MS SQL express2012@JacobH是,返回时出错。如何指定?我认为结尾的WHERE子句选择了要更新的行。若要更改您对代码段的看法,请将每个等号更改为“IN”并重新阅读。感谢您的问题和回答帮助我了解如何解决此问题!!基本的数据库设计问题仍然存在:如何防止公共表表达式或临时表将多行返回到t中?您是否确保值在poscode和devcode域中是唯一的?如果选择的结果是t包含多行,则更新将中断。非常欢迎您。。。我很乐意帮忙。我喜欢这种东西。