Oracle-left join兩表關聯只取B表匹配到的第一條記錄【over partition by(分組后對組內數據排序)】


背景:

   A表、B表兩表關聯,關聯出來的結果里B表有不止一條,需求是只要B表結果中的某一條(按某字段排序) 

  經過百度,發現 row_number() over(partition by a order by b desc)函數可用(需要說明下,order by 必須有缺少會報錯),以下是數據環境及結果。

 

  創建數據環境

復制代碼
create table A(ANAME varchar(20));
insert into A values('alan');
insert into A values('Alee');
insert into A values('aspn');

 
create table B
(
BNo varchar(10),
BTell varchar(20),
Name varchar(20)
);
insert into B values('NO1','1366666','alan');
insert into B values('NO1','1388888','alan');
insert into B values('NO1','1399999','alan');
insert into B values('NO2','1333333','Alee');
insert into B values('NO3','1311111','aspn');
insert into B values('NO3','1322222','aspn');
復制代碼

 

直接關聯查詢的話,結果如下

需求是只要每個人的第一條記錄(按BTELL排序)

復制代碼
select *
  from a
  left join (select *
               from (select b. *,
                            (row_number()
                             over(partition by bno order by BTell desc)) px
                       from b) e
              where px = 1) t
    on a.aname = t.name;
復制代碼

 

查詢結果如下

 

參考:https://www.cnblogs.com/luxd/p/8527457.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM