[英]How to optimize the SQL query with the subquery?
我想提高 SQL 查询的性能。 我有表 'tblEntries' 和列'sTag':
+----+------+-------+------+---------+
| Id | sTag | sPath | lVer | bActive |
+====+======+=======+======+=========+
| 1 | NULL | t1 | 100 | + |
| 2 | NULL | t2 | 110 | + |
| 3 | x1 | t4 | 110 | + |
| 4 | x1 | t3 | 120 | + |
| 5 | x2 | t7 | 100 | + |
+----+------+-------+------+---------+
客户端查询具有指定标记的路径,查询应返回具有下一个条件的指定条目:
“标记”条目比“未标记”条目具有更高的优先级。
当前 SQL 查询为:
SELECT lVer, sPath
FROM tblEntries
INNER JOIN
(SELECT MAX(lVer) AS V, sTag AS T
FROM tblEntries
WHERE bActive = TRUE
GROUP BY sTag)
ON lVer = V
WHERE T IS NULL OR T = 'user_tag'
ORDER BY T DESC
然后我可以 select 第一个满足条件的条目。 我可以避免子查询吗?
谢谢!
根据您的数据和数据库,这可能具有足够的性能:
select top (1) e.*
from tblEntries e
where e.bActive = TRUE and
(e.t IS NULL OR e.t = 'user_tag')
order by (e.t desc), -- null values last
t.lver desc;
如果速度确实是个问题,并且您在(t, active, lver desc)
上有一个索引,那么这可能会快一点:
(select top (1) e.*
from tblEntries e
where e.t = 'user_tag' and e.bActive = TRUE
order by e.lver desc
) union all
(select top (1) e.*
from tblEntries e
where e.t is null and e.bActive = TRUE and
not exists (select 1 from tblEntries e2 where e2.t = 'user_tag' and e2.bActive = TRUE )
order by e.lver desc
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.