多个存在的地方

Multiple where exists

我需要根据以下条件将 table_work 中的 value_check 列更新为 N

更新 value_check 为 N

  1. if employee_id in table_work 没有 employee_manager_id 记录 (blank/null 或根本没有记录)在 employees_contact table 当 getdate 在 contact_eff_dt 和 contact_end_dt 之间时(加入 使用 employee_id)
  2. 如果 employee_id 在 table_work 中有记录 employees_contact table 但 employee_manager_id work_location_state 不是 NJ 或 NY 或 ME ..mgr_work_location table 有 employee_manager_id 和 work_location_state 列。

我可以用 2 个更新语句来完成,有没有一种只使用一个更新语句的简单方法?也许使用多个 where exists 条件?

以下是我现在使用的 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')

第一个查询的 NOT EXISTS 条件可能可以通过 LEFT JOIN 在第二个查询中模拟,并检查 contact.employee_id IS NULL(不匹配的)

contact.eff_dt 上的限制可以从 WHERE 移动到 mgr_work_location 上的 LEFT JOIN

rextester 测试 here

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'))