簡體   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