我在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";
有任何想法怎么做?
它使用一个小数据集,但如果我们增加值列表,即使使用高命令超时它也会崩溃。
提前致谢
答案 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