Несколько там, где существует

Мне нужно обновить столбец value_check в table_work как N на основе следующих условий

Обновить value_check как N

  1. если employee_id в table_work не имеет записи employee_manager_id (пустой/нулевой или вообще нет записи) в таблице employee_contact, когда getdate находится между contact_eff_dt и contact_end_dt (присоединение с использованием employee_id)
  2. если employee_id в table_work имеет запись в таблице employee_contact, но employee_manager_id work_location_state не является NJ, NY или ME. В таблице mgr_work_location есть столбцы employee_manager_id и work_location_state.

Я могу сделать это с двумя операторами обновления. Есть ли простой способ использовать только один оператор обновления? Может быть, используя несколько условий, где существует?

Вот 2 обновления, которые я использую сейчас:

ОБНОВЛЕНИЕ 1

Update work 
set work.value_check = 'N' 
From table_work work 
Where wotk.value_check = 'Y' 
And not exists (select employee_manager_id 
                from employees_contact contact 
                Where contact.employee_id = work.employee_id 
                And getdate() between contact.eff_dt and contact.end_dt)

ОБНОВЛЕНИЕ 2

Update work 
set work.value_check = 'N' 
From table_work work 
Join employees_contact contact On contact.employee_id= work.employee_id 
Join mgr_work_location mgr On mgr.mgr_id = contact.employee_manager_id 
Where work.value_check = 'Y' 
And getdate() between contact.eff_dt 
and contact.end_dt And mgr.work_location_state not in ('NJ','NY,'ME')

person ACCADemy ACCADemy    schedule 30.11.2019    source источник
comment
Можете ли вы показать нам это: я могу сделать это с двумя операторами обновления? Спасибо!   -  person VBoka    schedule 30.11.2019
comment
Ваш вопрос не понятен. Пожалуйста, предоставьте образцы данных в виде кода и желаемого результата. Насколько я понял вопрос, вы можете использовать несколько критериев, объединяя их с помощью И, ИЛИ.   -  person Cetin Basoz    schedule 30.11.2019
comment
Обновите рабочий набор work.value_check = 'N' Из table_work work Где wotk.value_check = 'Y' И не существует (выберите employee_manager_id из employee_contact contact Где contact.employee_id = work.employee_id И getdate() между contact.eff_dt и contact.end_dt )   -  person ACCADemy ACCADemy    schedule 30.11.2019
comment
Обновить рабочий набор work.value_check = 'N' Из table_work work Присоединяйтесь к employee_contact contact On contact.employee_id= work.employee_id Присоединяйтесь к mgr_work_location mgr On mgr.mgr_id = contact.employee_manager_id Где work.value_check = 'Y' И getdate() между контактами. eff_dt и contact.end_dt И mgr.work_location_state не в ('NJ','NY,'ME')   -  person ACCADemy ACCADemy    schedule 30.11.2019


Ответы (1)


Критерии NOT EXISTS первого запроса, вероятно, можно эмулировать во втором запросе с помощью LEFT JOIN и проверить наличие contact.employee_id IS NULL (несопоставленных)

И эти ограничения на contact.eff_dt можно переместить из WHERE в LEFT JOIN на mgr_work_location.

Тест на rextester здесь

UPDATE work 
SET work.value_check = 'N' 
FROM table_work work 
LEFT JOIN employees_contact contact 
  ON contact.employee_id = work.employee_id
 AND contact.eff_dt <= getdate()
 AND contact.end_dt >= getdate()
LEFT JOIN mgr_work_location mgr 
  ON mgr.mgr_id = contact.employee_manager_id 
WHERE work.value_check = 'Y' 
  AND (contact.employee_id IS NULL 
       OR mgr.work_location_state NOT IN ('NJ','NY','ME'))
person LukStorms    schedule 30.11.2019
comment
Спасибо. Совсем забыл про левый джойн ???? - person ACCADemy ACCADemy; 06.12.2019