开发者社区 问答 正文

Oracle连表查询,A表一条数据,B表有多条数据,连表查询,取A表信息和B表排序后的一条数据,问题

求教,ORACLE查询的一个疑惑,如题描述:Oracle连表查询,A表一条数据,B表有多条数据,连表查询时,取B表排序后的一条数据,如何在一条SQL里查询?

 

案例:

比如有人员信息表person_info,月收入表person_income,用person_id字段关联

 

person_info表

person_id

姓名NAME

 

person_income表

person_id

月收入income

更新时间updated_date

 

 

我要根据person_id查询 人员姓名和他最近一个月的薪资

 

查询的时候,下面这2个SQL都是正确的,但是结合在一起就报错了,这是为啥......

正确的sql

1、根据person_id查询最新薪资

select income from (select income from person_income where person_id='001' order by updated_date desc) where rownum=1

 

2、根据person_id查询姓名和默认排序的第一条薪资

select A.person_name,(select B.income from person_income B where A.person_id=B.person_id and rownum=1) from person_info A where A.person_id ='001'

 

 

报错的SQL

根据person_id查询姓名和排序后的薪资

select A.person_name,(select income from (select B.income from person_income B where A.person_id=B.person_id order by updated_date desc) where rownum=1) from person_info A where A.person_id ='001'

报错信息:

ORA-00904:"A"."person_id":标识符无效

 

求大神赐教

展开
收起
huc_逆天 2020-05-28 09:16:35 1383 分享 版权
阿里云 AI 助理回答

在Oracle中,子查询中的表别名不能直接在外部的子查询中使用。这就是为什么你的第三个SQL报错的原因。解决这个问题的一个方法是将整个子查询作为外层查询的一部分来构造,确保内外层查询的上下文正确隔离。下面是修改后的SQL示例:

SELECT A.person_name, C.income
FROM person_info A,
     (SELECT B.person_id, B.income
      FROM person_income B
      WHERE B.person_id = '001'
      ORDER BY B.updated_date DESC
      FETCH FIRST 1 ROW ONLY) C
WHERE A.person_id = '001' AND A.person_id = C.person_id;

这里做了以下几点调整: 1. 使用了FETCH FIRST 1 ROW ONLY替代了rownum=1来获取排序后的第一条记录,这是Oracle 12c及以上版本推荐的做法。 2. 将内层子查询(获取最新薪资的部分)定义为一个独立的子查询(我标记为C),并直接与person_info表进行连接查询,这样就可以在外部查询中引用A表的person_id了。 3. 添加了A.person_id = C.person_id到WHERE条件中,以确保人员信息与最新的收入记录正确匹配。

这个查询应该能够满足你的需求,即根据person_id查询出人员姓名和他最近一个月的薪资。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答