繁体   English   中英

选择没有嵌套关联记录的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM