用于筛选行的SQL Server查询不包含值

时间:2015-01-29 11:09:48

标签: sql sql-server

我有一个包含IDCourseIDProvince列的表格;可以在不同省份开设课程。我希望获得给定IDCourse中未赋予的所有ProvinceID值。

例如。

IDCourse     IDProvince
------------------------
   1        100
   1        102
   1        105
   2        100
   2        108
   3        109
   3        107
   4        100
   4        105
   4        106
   5        102
   5        108

我希望IDProvince = 100上没有传授所有课程,因此结果只是IDCourse 3和5

我可以做一个像

这样的简单查询
Select IDCourse 
from MyTable 
Where IDCourse not in (Select IDCourse 
                       From Mytable
                       Where IDProvince = 100)

但我想优化它,还有其他方法可以执行此查询吗?顺便说一下,这只是一个例子,实际上查询更大。

谢谢!

3 个答案:

答案 0 :(得分:0)

实现可能提供相同或更好性能的相同结果的另外两种方法是使用not existsexcept

使用not exists(应该提供与使用not in完全相同的执行计划:

SELECT IDCourse FROM MyTable m
WHERE NOT EXISTS (
    SELECT 1 FROM Mytable
    WHERE IDProvince = 100
    AND idcourse = m.idcourse
)

使用except应该给出略微不同的执行计划(并且在样本数据上表现稍好一些 - 但鉴于样本数量有限,我不会得出任何结论):

SELECT IDCourse FROM MyTable 
EXCEPT
SELECT IDCourse FROM MyTable WHERE IDProvince = 100

我不能告诉你,如果任何查询的表现会更好,这取决于索引和其他因素,所以请亲自尝试看看:)

答案 1 :(得分:0)

  

为了优化它 - 通过使用变量sql server使用   相同的缓存计划,无论IDProvince中的输入。只是改变了   变量

 DECLARE @IDProvince int
    SELECT  IDCourse   
    FROM tbl
    WHERE IDCourse NOT IN (SELECT IDCourse 
                       FROM tbl 
                       WHERE IDProvince=@IDProvince)

答案 2 :(得分:0)

我不确定这是否适合您的大型查询(因为我们没有该代码),但它可能很简单:

SELECT IDCourse
FROM TABLE
WHERE IDProvince <> 100
GROUP BY IDCourse

或者我在你的问题中遗漏了什么?