Как избавиться от вложенного выбора в предложении 'where'? - PullRequest
2 голосов
/ 15 ноября 2011

В моей БД есть таблица, в которой хранятся параметры конфигурации некоторых приложений и версии этих конфигов:

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 ]

4 голосов
/ 15 ноября 2011

Вы можете использовать аналитическую функцию.Это будет, по крайней мере, немного эффективнее, поскольку позволит избежать двойного попадания в таблицу.

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 голос
/ 15 ноября 2011

Объединение 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
0 голосов
/ 15 ноября 2011

А как же

select app_id, config, MAX(version) version  from config 
group by app_id, config
...