背景:
A表、B表兩表關聯,關聯出來的結果里B表有不止一條,需求是只要B表結果中的某一條(按某字段排序)
首先想到了直接寫個帶排序的子查詢去匹配外圍的值,從這個結果集中只要第一條,但是經過驗證發現,里邊的條件是獲取不到外層的值的,因此此方案不可行。
經過百度,發現 row_number() over函數可用,以下是數據環境及結果。
創建數據環境
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;
查詢結果如下
問題解決