感谢您的帮助,我希望我能够提供足够的信息。
我需要回滚与资产表中相当多条目相关联的所有者(一个所有者已应用于许多系统)。我有一个包含我需要的信息的历史表,以及一个嵌入其中的员工表,因为由于某种原因,历史表存储了名称而不是employee_id。
来源数据:
asset_table
有asset_id, employee_id, asset_tag
employee_table
有employee_id, name
history_table
有asset_id, old_name, new_name
update asset_table
set employee_id = (select employee_id
from employee_table
where name like (select old_name
from history_table
where asset_table.asset_id=history_table.asset_id
and new_name like 'tobe replaced'))
但是,子查询每行会产生多个结果。
我缺少什么来限制子查询结果?
MSSQL server 2012
答案 0 :(得分:1)
我想你需要一个历史上最后一个人:
update at set
employee_id = e.employee_id
from asset_table at
cross apply
(
select top (1)
h.old_name
from history_table h
where at.asset_id = h.asset_id
and h.new_name = 'tobe replaced'
order by h.<date or id or something> desc
) h
inner join employee_table e
on e.name = h.old_name
TOP 1
将修复&#34;多个结果&#34;问题
注意,LIKE
没有%
的工作方式与=
完全相同。
答案 1 :(得分:0)
您可以使用JOIN代替子查询来编写更新语句如下,提供表结构和数据以获得更正确的查询:
update at set at.employee_id = et.employee_id
from asset_table at
inner join history_table ht on at.asset_id = ht.asset_id
and ht.new_name like '%tobe replaced%'
inner join employee_table et on et.name = ht.old_name
and et.employee_id = at.employee_id