如何摆脱'where'子句中的嵌套选择?

时间:2011-11-15 17:03:16

标签: sql oracle oracle10g query-optimization

我的数据库中有一个表,其中包含某些应用程序的配置设置以及这些配置的版本:

app_id | config  | version
--------------------------
app1   | conf1v1 |   1
app2   | conf2v1 |   1
app1   | conf1v2 |   2

我需要为每个应用程序获取最新配置(具有最大版本号的配置)。我使用这样的查询:

select c.app_id, c.config, c.version
from config c       
where 
  c.version=(select max(c2.version) from config c2 where c2.app_id = c.app_id)

但似乎效率低下。我想知道,有更有效的方法来完成这项任务吗?

3 个答案:

答案 0 :(得分:4)

您可以使用分析功能。这将至少更有效率,因为它避免了两次击中表。

SELECT app_id, config, version
  FROM (SELECT app_id,
               config,
               version,
               row_number() over (partition by app_id order by version desc) rnk
          FROM config)
 WHERE rnk = 1

答案 1 :(得分:1)

将CTE与ROW_NUMBER()组合将允许对表进行单个解析(如果可用则使用索引,以进一步减少读取)......

WITH
  reversioned_config
AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY app_id ORDER BY version DESC) as descending_version
  FROM
    config
)
SELECT
  app_id,
  config,
  version
FROM
  reversioned_config
WHERE
  descending_version = 1

答案 2 :(得分:0)

怎么样?
select app_id, config, MAX(version) version  from config 
group by app_id, config