oracle两张表数据匹配,Oracle-left join两表关联只取B表匹配到的第一条记录

  • Post author:
  • Post category:其他


背景:

A表、B表两表关联,关联出来的结果里B表有不止一条,需求是只要B表结果中的某一条(按某字段排序)

经过百度,发现 row_number() over(partition by a order by b desc)函数可用(需要说明下,order by 必须有缺少会报错),以下是数据环境及结果。

创建数据环境

1f2ba04f36128a6cab9af7e2a6969724.gif

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

eca113df0d9892c911d3ea76ca06becd.gif

直接关联查询的话,结果如下

20387a70db37ce54cd404469ad0f5976.png

需求是只要每个人的第一条记录(按BTELL排序)

a259d15fe9fba8bb12d971ff7db9dc4d.gif

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;

28c1359426975e90d4ae84300895f05a.gif

查询结果如下

8b127a9868ec65e43547d2b61f098035.png