2016-11-30 3 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 сервер 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

Спасибо, это сработало. Я удалил вашу финишную линию, так как заблокировал какие-либо результаты (активы были назначены на «замену»). – 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 без % работает точно так же, как =.

Смежные вопросы