Oracle оставил внешнее соединение: как ограничить количество запросов в правой таблице - PullRequest
0 голосов
/ 08 сентября 2010

У меня есть большое утверждение:

SELECT
    a.user_id, a.user_name,
    s.name, s.value,
    d.default
FROM
    accounts a,
    settings s
    LEFT OUTER JOIN default d ON ( d.name = s.name )
WHERE
    s.user_id = a.user_id;

Проблема в том, что settings содержит большое количество записей, и мне нужно выбрать запись с самым высоким ID.Я могу себе представить, изменить ли оператор и заменить объединение на подвыбор (который получает правильную запись из settings), но мне любопытно посмотреть, есть ли лучшее решение.Любой вклад приветствуется.Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2010

получение наибольшего идентификатора из таблицы можно сделать с помощью

select max(id) ...

или с

select id from settings where rownum=1 order by id desc

(я предпочитаю первое решение) или, как предложил Джон, но вам все равно понадобится подзапрос. Еще одна вещь, в вашем примере может быть какая-то опечатка, я не вижу, откуда идет d, и нет смысла делать автоматическое соединение слева ...

Вот что я бы написал

SELECT
    user_id, user_name,
    name, value,
    default
FROM
    accounts join 
    (select user_id,name 
     from settings 
     where RANK() OVER (ORDER BY id DESC, PARTITION BY user_id) = 1) using(user_id)
    LEFT OUTER JOIN default using ( name )

... все еще подзапрос

0 голосов
/ 08 сентября 2010

Вы можете использовать подзапрос, чтобы получить нужные результаты из нужной таблицы.

Что-то вроде:

SELECT
    *
FROM
    accounts a,
    (
      SELECT
          user_id,
          *
      FROM
          settings
      WHERE
          RANK() OVER (ORDER BY id DESC, PARTITION BY user_id) = 1
    ) s
...