SQL查询交集

时间:2014-11-10 14:26:44

标签: c# sql sql-server

我在SQL中使用交叉点时遇到问题:

  

查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。如果您认为自己错误地收到了此消息,请与客户支持服务部​​门联系以获取更多信息。

我使用for循环生成所有相交的查询并检索所需的数据。

我的问题:

我需要选择varC,其中值列表中存在varA,值列表中也存在varB。

使用WHERE IN varA ('','','','',...'') and varB ('','','','',...'')结果不正确,因为它不会限制所有值。

所以我使用INTERSECT

for (int i = 0; i < varA.Count; i++)
{
    for (int j = 0; j < varB.Count; j++)
    {
        sqlQuery += @"SELECT DISTINCT varC FROM tblData WHERE varD='XPTO' AND varA='" + varA[i] + "' AND varB='" + varB[j] + "' INTERSECT ";
    }
}   

   sqlQuery = sqlQuery.Remove(sqlQuery.Length - 10, 10); //to remove last INTERSECT
   sqlQuery += " ORDER BY varC ASC";

有任何想法怎么做?

它使用一个小数据集,但如果我们增加值列表,即使使用高命令超时它也会崩溃。

提前致谢

3 个答案:

答案 0 :(得分:2)

我怀疑您要生成此表单的查询:

SELECT DISTINCT varC 
FROM tblData 
WHERE 
    varD='XPTO' 
    AND (
        (varA = "VALUEA1" and varB = "VALUEB1")
     OR (varA = "VALUEA2" and varB = "VALUEB2")
     OR (varA = "VALUEA3" and varB = "VALUEB3")
     OR (varA = "VALUEA4" and varB = "VALUEB4")
    )

答案 1 :(得分:2)

也许你想要这个:

select varc
from tbldata
group by varc
having sum(case when varA in (<list of A values>) then 1 else 0 end) > 0 and
       sum(case when varB in (<list of B values>) then 1 else 0 end) > 0;

答案 2 :(得分:1)

您可以使用具有以下三个arg列的临时表生成脚本:

declare @t table (A nvarchar(max), B nvarchar(max), D nvarchar(max))
insert into @t (A, B, D) values ('valA1', 'valB1', 'valD1')
insert into @t (A, B, D) values ('valA2', 'valB2', 'valD2')
...

select distinct varC 
from tblData D 
inner join @t T on D.A = T.A and D.B = T.B and D.D = T.D