2014-10-30 39 views
0

我正在使用以下查询来显示只有那些具有两个资格的检查员。有效的方法来检查列是否具有所有特定值

 DECLARE @CertType QualificationType; --2,3 

     select i.InspectorID from Inspectors i 
     INNER JOIN (
      SELECT _id.InspectorID 
      FROM InspectorDocs _id 
      WHERE _id.QualificationTypeID IN (select [QualificationTypeID] from @CertType) GROUP BY _id.InspectorID 
      HAVING COUNT(DISTINCT _id.QualificationTypeID) = (select count(*) from @CertType) 
      ) as id on id.inspectorid = i.inspectorid 

有没有更好的方法来找到列是否有所有给定的值?

架构

检查员:检查员(PK)

InspectorDocs:的DocID(PK),InspectorID(FK),QualificationTypeID(FK)

QualificationTypE:QualificationTypeID(PK)

+0

提供模式和数据样本。 – Horaciux 2014-10-30 15:07:05

回答

1

如果我没有弄错你在做什么是所谓的关系部门,而另一个(稍微不直观)的方式来表达这一点是下面的查询,这应该给予bette [R性能:

select * from Inspectors i 
where not exists (
    select * from QualificationType c 
    where QualificationTypeID IN (2,3) 
    and not exists (
     select * from InspectorDocs id 
     where c.QualificationTypeID = id.QualificationTypeID 
     and id.InspectorID = i.InspectorID)) 

如果你想更深入地研究这个问题,我建议由乔·塞科阅读Divided We Stand: The SQL of Relational Division

相关问题