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

时间:2010-09-08 12:50:17

标签: sql oracle left-join

我有一个很大的声明:

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 :(得分:0)

您可以使用子查询从右表中获取您想要的结果。

类似的东西:

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

答案 1 :(得分:-1)

从表中获取最高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 )

......仍然是子查询