是否有更简单的方法来执行此查询?
实际上在更大的查询的一部分中使用它
宁可不要使用EXCEPT,UNION,INTERSECT
作为更大的查询的一部分,优化器可以在派生表上获得愚蠢,除了
发布较大的查询是没有价值的,因为它是动态的
docSVsys上的PK是sID
docMVenum1上的PK是sID,enumID,valueID
select sID from docSVsys
EXCEPT
select sID
from docMVenum1
where enumID = 140
and valueID in (1,2)
group by sID
having count(*) = 2
select docSVsys.sID from docSVsys
left outer join
( select sID
from docMVenum1
where enumID = 140
and valueID in (1,2)
group by sID
having count(*) = 2 ) as joinTable
on docSVsys.sID = joinTable.sID
where joinTable.sID is null
我知道两个查询是相同的 我正在寻找第三个更简单的
答案 0 :(得分:1)
我认为IN运营商可能会导致效率低下。试试这个:
select sID
from docSVsys
EXCEPT
select sID
from (
select d1.sID
from docMVenum1 d1
join docMVenum1 d2
on d1.sID = d2.sID
where d1.enumID = 140 and d1.valueID = 1
and d2.enumID = 140 and d2.valueID = 2
) T
答案 1 :(得分:0)
你绝对需要聚合吗?你不能只是对数据进行分组和聚合作为创建的表,这将是一个性能助推器。
CREATE TABLE new_table AS(选择sID 来自docMVenum1 int 其中enumID = 140 和(1,2)
中的valueID您必须运行的唯一查询是以下内容。
从new_table中选择*,其中count(*)= 2 按照sID分组