历史给了我太多的子查询结果

时间:2016-11-30 07:01:51

标签: sql sql-server subquery restore

感谢您的帮助,我希望我能够提供足够的信息。

我需要回滚与资产表中相当多条目相关联的所有者(一个所有者已应用于许多系统)。我有一个包含我需要的信息的历史表,以及一个嵌入其中的员工表,因为由于某种原因,历史表存储了名称而不是employee_id。

来源数据: asset_tableasset_id, employee_id, asset_tag

employee_tableemployee_id, name

history_tableasset_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

2 个答案:

答案 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