Sql 选择没有嵌套关联记录的行
具有非常简单的表结构:Sql 选择没有嵌套关联记录的行,sql,sql-server,Sql,Sql Server,具有非常简单的表结构: 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, contrac
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 );
员工-<任务-<合同-<任务
我想选择没有任何关联任务的所有员工
最有效的方法是什么?您可以将前3个表内部联接,并将not in用于第4个表
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)
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)
您可以将前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)
将员工ID添加到任务表中。然后您可以检查COUNTEMPLOYEE_ID是否为零 请注意,您定义这些实体的方式迫使您走从员工到合同到分配到任务的整个道路。向每个实体添加自然键将使您能够直接访问所需的数据。您仍然可以保留标识列以提高索引效率 主要建议: 合同员工ID,合同ID; 外派员工ID、合同ID、外派ID; 任务员工ID、合同ID、任务ID、任务ID
请注意,这些都应该是可选的1:M关系。将员工ID添加到任务表中。然后您可以检查COUNTEMPLOYEE_ID是否为零 请注意,您定义这些实体的方式迫使您走从员工到合同到分配到任务的整个道路。向每个实体添加自然键将使您能够直接访问所需的数据。您仍然可以保留标识列以提高索引效率 主要建议: 合同员工ID,合同ID; 外派员工ID、合同ID、外派ID; 任务员工ID、合同ID、任务ID、任务ID
请注意,这些都应该是可选的1:M关系。您可以对前3个表进行内部联接,并在第4个表中使用not in。您可以对前3个表进行内部联接,在第4个表中使用not in。如果员工有多个工作分配,我想我需要DISTINCT。如果员工有多个工作分配,我想我需要DISTINCT。最后我选择了@Mladen Prajdic解决方案。最后我选择了@Mladen Prajdic解决方案。