在WHERE中使用LIKE更新表列

时间:2018-02-12 21:29:28

标签: sql sql-update subquery where sql-like

我有一个表(ENTITY),需要根据ID(FUNNCODE)进行更新,但ID(FUNNCODE)在两个其他表之间链接(从JOINT再到POSITION)  并且与数据所在的位置无关(表NEORSD)。我可以绑定的唯一参数是NEORSD表和POSITION表之间的位置名称。当我将LIKE语句放入where子句时,我得到一个错误。如果有人能指出我正确的方向,我将不胜感激!

表: NEORSD:包含范围信息和'位置名称(= Tag_No)'

ENTITY:需要更新并接受范围信息(Holds FUNCCODE)

JOINT:保持FUNCCODE(名为POSFUNCCODE)和相应的POSCODE

POSITION:包含POSCODE和'位置名称(= 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%'))

2 个答案:

答案 0 :(得分:1)

如果NEORSD_1199有多行且tag_no类似于'%PIT%',它应该使用哪个NEORSD_1199.RANGE0值来更新ENTITY.RANGE0?

这是您的SQL的db引擎问题。

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

  1. 首先,您需要从POSITION表中获取每个位置代码的列表,其中位置ID类似于'%PIT%'。这可能是一个代码,可能是一百个代码。

  2. 然后您从JOINT表中获取每个位置功能代码,其中位置代码位于您刚刚收集的位置代码列表中。再一次,可能是一个,可能是一百个。

  3. 然后您从NEORSD1199表中获取RANGE0的所有值的列表,其中Tag_No就像'%PIT%'。同样,这可以是一个值,也可以是一百个列表。

  4. 然后,您从ENTITY表中获取功能代码位于您从JOINT表(上面的步骤2)收集的位置功能代码列表中的每一行,并且您已经获得了将每行中的RANGE0更新为您在步骤3中捕获的值。

  5. 问题在于'价值'在步骤3中返回的可以是值列表。如果     NEORSD1199有四行标签编号类似于'%PIT%'     (例如PIT01,PIT02,PIT03,APIT00),并且这些行中的每一行都有不同     RANGE0(例如1,2,3,99),然后DB引擎用来更新ENTITY表中各行的RANGE0这四个值中的哪一个?

答案 1 :(得分:0)

感谢@SQLCliff提供有助于找到解决方案的问题。我在NEORSD表中创建了一个ID列,创建了一个临时表,其中包含FUNCCODE和NEORSD中的范围之间的链接。然后我使用连接更新了ENTITY。我可以在临时表的末尾插入where子句,以便在需要时进行过滤。由于它是批量更新,因此我不再需要where子句。我的大脑只是喜欢让事情比他们需要的XD更复杂

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