2016-11-30 41 views
0

我很感谢您的帮助,希望我能够提供足够的信息。历史给我提供了太多子查询结果

我需要回滚与资产表中相当多条目相关联的所有者(一位所有者已应用于很多系统)。我有一个包含我需要的信息的历史记录表,以及一个嵌入其中的员工表,因为历史表由于某些原因而存储名称而不是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

请添加一些示例源数据和所需的结果。 – FDavidov

回答

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 
+0

谢谢,这工作。因为它阻止了任何结果,我确实删除了您的最终产品线(这些资产被分配给'tobe替换')。 – katzu

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将修复“多个结果”问题。

请注意,LIKE没有%的工作方式与=完全相同。