这个查询可以简化吗?

时间:2013-12-24 18:58:16

标签: tsql sql-server-2008-r2

是否有更简单的方法来执行此查询?

实际上在更大的查询的一部分中使用它 宁可不要使用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 

我知道两个查询是相同的 我正在寻找第三个更简单的

2 个答案:

答案 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分组