2014-10-30 86 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

相關問題