如何使用子查询优化 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 具有下一个条件的指定条目:
- 如果有一个带有指定标签的条目,它应该 return
具有最大 lVer 值和 bActive 的条目应该为 TRUE。
- 如果
没有带有指定标签的条目,它应该 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
);
我想提高 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 具有下一个条件的指定条目:
- 如果有一个带有指定标签的条目,它应该 return 具有最大 lVer 值和 bActive 的条目应该为 TRUE。
- 如果 没有带有指定标签的条目,它应该 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
);