2010-09-08 84 views
0

HOWTO限制的请求我有一个大的语句:甲骨文左外连接:右表

​​

的问题是,settings包含大量条目,我需要选择一个具有最高的ID。我可以想象改变这个陈述并用一个子选择(从settings获取正确的条目)替换联接,但我很好奇看看是否有更好的解决方案。任何输入赞赏。非常感谢!

回答

0

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

喜欢的东西:

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

窗口函数不能在WHERE子句中使用。 – 2010-09-08 13:03:28

+0

哦,真的吗?好吧,在一个子选择然后,1秒。 – 2010-09-08 13:04:08

-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) 

...仍子查询

+0

谢谢,纠正了关于默认/ d表的例子。 – MrG 2010-09-08 13:24:09

+0

好的我已经加入了我的尝试... – 2010-09-08 13:53:16

+2

您的最后一个查询不会可靠地返回预期的结果,因为'rownum = 1'将在'order by user_id desc'之前评估。 – Allan 2010-09-08 15:41:08