[英]Select rows without nested associated records
具有非常简单的表结构:
CREATE TABLE dbo.employees (id int PRIMARY KEY);
CREATE TABLE dbo.assignments (id int PRIMARY KEY, employee_id int );
CREATE TABLE dbo.contracts (id int PRIMARY KEY, assignment_id int );
CREATE TABLE dbo.tasks (id int PRIMARY KEY, contract_id int );
员工-<分配-<合同-<任务
我要选择没有任何相关任务的所有员工。
最有效的方法是什么?
select id
from employees E
where not exists (
select *
from assignments A
join contracts C on A.ID = C.assignment_id
join tasks T on C.ID = T.contract_id
where A.employee_id = E.id)
您可以inner join
前3个表, not in
使用第4个表。
select
e.*
from dbo.employees e
inner join dbo.assignments a on a.employee_id = e.id
inner join dbo.contracts c on c.assignment_id = a.id
where c.id not in (select distinct contract_id from dbo.tasks)
将EMPLOYEE_ID添加到TASK表中。 然后,您可以检查COUNT(EMPLOYEE_ID)是否为零。
请注意,您定义这些实体的方式会迫使您“遍历”从雇员到合同再到任务分配的整个路径。 将自然键添加到每个实体将使您能够直接访问所需的数据。 您仍然可以保留标识列以提高索引效率。
自然关键建议:CONTRACT(EMPLOYEE_ID,CONTRACT_ID); ASSIGNMENT(EMPLOYEE_ID,CONTRACT_ID,ASSIGNMENT_ID); 任务(EMPLOYEE_ID,CONTRACT_ID,ASSIGNMENT_ID,TASK_ID)。
请注意,这些都应该是可选的(1:M)关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.