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

背景:

   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

原文地址:https://www.cnblogs.com/Formulate0303/p/12503299.html

时间: 2024-08-21 08:08:30

Oracle-left join两表关联只取B表匹配到的第一条记录的相关文章

数据库表分组后按时间排序,取每个分组中最近的一条记录

数据库表分组后按时间排序,取每个分组中最近的一条记录.在网上找了好几个,都不行,最终找到了解决办法,Oracle亲测可以. with m as (select id,max(times) c from test_max group by id)select n.id,n.duowei from test_max n join m on m.id=n.id and m.c=n.times 第一次在博客园写知识,愿意和大家分享.

Oracle取查询结果数据的第一条记录SQL

Oracle取查询结果数据的第一条记录SQL: select * from (select * from <table> order by <key>) where rownum=1; select * from (select * from <table> order by <key> desc) where rownum=1;

mybatis 关联查询时,从表只返回第一条记录解决办法

如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条. 造成以上情况可能的原因: 1.级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的.但在mybatis中主从表需要为相同字段名设置别名.设置了别名就OK了. 例子: 主表Standard, 从表StandEntity,均有名为id的字段 1 <resultMap id="StandardAndEntityResultMap" type="whu.edu.irlab

SQL表关联赋值、系统表、表数据删除

1. 表与表的关联赋值(用于表与表之间有关联字段,数据互传) 双表关联赋值 UPDATE #B SET #B.D=#A.B from #B inner join #A on #B.C=#A.A 多表关联赋值 update a set a.e=c.n from a left join b on a.e=b.j left join c on b.k=c.m 2. 两种删除方式(TRUNCATE TABLE <--> DELETE FROM) TRUNCATE TABLE #USER 删除极快,无日

取得left join的第二表中符合条件的第一条记录

问题描述 有表一 tableA tid     username     title 1         lily       我公司将进行xx培训 2        angus      关于秋游的通知 3        boss       这个月不发奖金 4        vivi       新产品上市 表二 tableB tid      time     txt 1        0809    大家快来.... 2        0810    我是新来的,大家好 2       

SQL分组取每组前一(或几)条记录(排名)

mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm --按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三个值 b 1 b1--b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b 5 b5b5b5b5b5 */ --创建表

Lua中只读表和只允许修改表

Lua中的table表非常灵活强大,可以随时加入和修改,但有时在多人协作和 一些项目中有些凌乱,我们可以利用元表的性质来保护我们的一些表格. 1.Lua中的只读表 function ReadOnlyTable (t) local proxy = {} local mt = { __index = t, __newindex = function (t,k,v) error("attempt to update a read-only talbe",2) end } setmetatab

MSSQL分组取后每一组的最新一条记录

数据库中二张表,用户表和奖金记录表,奖金记录表中一个用户有多条信息,有一个生效时间,现在要查询: 奖金生效时间在三天前,每个用户取最新一条奖金记录,且用户末锁定 以前用的方法是直接写在C#代码中的: for(所有末锁定用户) 查询奖金记录表 top 1 where uid=??? order by 生效时间 desc if(上面查询的记录生效时间在三天前) 输出 今天花了大部分时间研究了一下,终于找到一条SQL语句就可以把结果查出来的方法: 那个row_number函数在MSSQL2008以上才

sql分组获取第一条记录(sql+oracle)

sql版本 select * from (select t.CloseDate,t.ExpiryDate,t.DataTypeLookupID,ROW_NUMBER() over(partition by CloseDate,ExpiryDate,DataTypeLookupID order by CloseDate,ExpiryDate,DataTypeLookupID) as new_index from dbo.IndexVolatilityMarketData t ) a where a