繁体   English   中英

Oracle左外部联接:如何限制右表中的请求

[英]Oracle left outer join: howto limit requests in right table

我有一个很大的声明:

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获取正确的条目),但是我很好奇是否有更好的解决方案。 任何输入表示赞赏。 非常感谢!

您可以使用子查询从正确的表中仅获取所需的结果。

就像是:

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

从表中获取最高ID可以通过

select max(id) ...

或与

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

(我更喜欢第一个解决方案),或者就像John提出的那样,但是无论如何您都需要一个子查询。 还有一件事,您的示例中可能有一些错别字,我看不到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 )

...仍然是子查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM