我有一个包含IDCourse
和IDProvince
列的表格;可以在不同省份开设课程。我希望获得给定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)
但我想优化它,还有其他方法可以执行此查询吗?顺便说一下,这只是一个例子,实际上查询更大。
谢谢!
答案 0 :(得分:0)
实现可能提供相同或更好性能的相同结果的另外两种方法是使用not exists
或except
:
使用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
或者我在你的问题中遗漏了什么?