select nid, avg, std from sView1
where sid = 4891
and nid in (select distinct nid from tblref where rid = 799)
and oidin (select distinct oid from tblref where rid = 799)
and anscount > 3
这是我正在尝试运行的查询。像这样运行大约需要3-4秒。但是,如果我使用子查询替换“4891”值(select distinct sid from tblref where rid = 799)
,则该过程只会挂起,即使子查询只返回一个sid
。
该查询应返回结果集上具有平均值(avg)和标准差(std)的数据集,该结果集是通过sView1中的嵌套视图计算的。然后,此数据集将通过另一个视图运行,以获得一些顶级平均值和stdev。
平均值可能需要包含多于1个sid
(sid标识数据集)。
如果不透露不应泄露的代码库和代码结构,很难描述它;)
有人建议在尝试使用子查询时查询挂起的原因吗? (代码是从最初使用嵌套游标重建的,因为我被告知游标是魔鬼的工作,而嵌套游标可能会让我无菌)
答案 0 :(得分:0)
试试这个。一旦找到匹配条件就存在返回,select distinct将需要遍历数据集并选择对其进行排序以删除重复项。
SELECT nid,avg,std from sView1 AS SV
WHERE EXISTS (SELECT * FROM TblRef AS TR WHERE sv.sid = Tr.sid AND Sv.nid = tr.nid AND sv.oid = tr.oid AND tr.rid = 799)
AND ansCount>3
此外,如果不访问查询计划和表结构,则很难提供有意义的答案。所以DDL和样本数据肯定会有所帮助。