[英]How to find LEFT OUTER JOIN or RIGHT OUTER JOIN with ORACLE JOIN (+)
[英]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.