如何使用子查询优化 SQL 查询?

How to optimize the SQL query with the subquery?

我想提高 SQL 查询的性能。我有 table '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  |   +     |
+----+------+-------+------+---------+

客户端查询具有指定标签的路径,查询应该return 具有下一个条件的指定条目:

  1. 如果有一个带有指定标签的条目,它应该 return 具有最大 lVer 值和 bActive 的条目应该为 TRUE。
  2. 如果 没有带有指定标签的条目,它应该 return 条目 具有 NULL sTag 值和最大 lVer 值和 bActive 应该是真实的。

"tagged" 条目的优先级高于 "non-tagged" 条目。

当前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
);