Sql 检索所有记录,其中所有相关记录都等于字符串

Sql 检索所有记录,其中所有相关记录都等于字符串,sql,tsql,Sql,Tsql,我有两张桌子。一个包含项目列表,另一个包含这些项目中的任务列表 我只想列出所有任务状态为“完成”的项目 我的数据如下所示: 项目表: ID,ProjectName,ProjectStatus 任务表: ID, ProjectID, TaskName, TaskStatus Tasks.ProjectID=Projects.ID 我可以使用基本的select语句来获取所有记录,并可以筛选TaskStatus是特定状态的位置,但同样,我只需要一个所有任务都已完成的项目列表 提前感谢您的帮助 您可

我有两张桌子。一个包含项目列表,另一个包含这些项目中的任务列表

我只想列出所有任务状态为“完成”的项目

我的数据如下所示:

项目表:

ID,ProjectName,ProjectStatus
任务表:

ID, ProjectID, TaskName, TaskStatus
Tasks.ProjectID=Projects.ID

我可以使用基本的select语句来获取所有记录,并可以筛选TaskStatus是特定状态的位置,但同样,我只需要一个所有任务都已完成的项目列表


提前感谢您的帮助

您可以使用不存在子查询:

select * 
  from Projects P
 where NOT EXISTS (select 1 from Tasks where Tasks.ProjectID = P.ID and TaskStatus <> 'COMPLETE')
select *
  from Projects
 where ID NOT IN (select ProjectID from Tasks where TaskStatus = 'COMPLETE')
是否使用其中一种,将取决于表数据量和索引:

第一个选项将为父查询的每一行运行一个子查询,但如果存在,则将通过ProjectID索引访问(可能是)

第二个选项将首先运行子查询,仅运行一次,然后使用子查询结果运行父查询。但是子查询可能不会使用任何索引,因为它在TaskStatus字段上不太可能有索引,这没有多大意义

但是,如果Tasks表上没有很多行,那么在任何情况下都不会使用索引,因为只对表进行完整扫描会更便宜。因此,我的建议是,检查执行计划,比较成本,如果可能,运行一些基准测试,以确定哪个选项更适合此情况或任何其他情况。

尝试以下方法:

SELECT ID, ProjectName            -- This query will select all projects where
FROM Projects                     -- ID is not on the list of the subquery
WHERE ID  NOT IN                                    
        ( SELECT ProjectID                    -- This subquery will get all
          FROM Tasks                          -- ProjectID who has INCOMPLETE
          WHERE TaskStatus <> 'COMPLETE')     -- taskStatus

现在,请确保:当您说所有相关任务都已完成时,您是否以传统方式使用该术语,即所有零个或多个任务都已完成,或者您是否会要求项目至少有一个任务?通常,一个没有相关任务的项目是你想要的,但是有些人确实以一种有趣的、非经典的逻辑方式使用了所有这些……谢谢你的澄清。我是认真的。我已经创建了应用程序,以便在创建项目时创建初始任务。谢谢。这正是我需要的。