use*_*515 7 oracle oracle10g oracle11g
我正在编写一个查询,它在 select 语句中嵌套了查询,如下所示。
Select t1.R1,
(
select * from
(
select t2.R2
from table2 t2
where t2.Condition_1=t1.C1
order by t2.Condition_2 desc
)
where rownum=1
),
t1.R3
from table1 t1
Run Code Online (Sandbox Code Playgroud)
我正在尝试将主查询对象传递到 select 语句中的子查询内的子查询中。
当我执行这个时,我在t1.C1.
我可以将主表的对象传递table1给第一个子查询,但是如何将列传递给table1子查询中的子查询?
在这种情况下,有人可以帮助我吗?
您只能引用低至一级子查询的对象,因此t1无法在内部子查询中识别。
有几种方法可以做到这一点。坚持使用当前的子查询,您可以将其设为内嵌视图并加入其中:
select t1.r1, t2.r2, t1.r3
from table1 t1
join (
select *
from (
select condition_1, r2
from table2
order by condition_2 desc
)
where rownum = 1
) t2 on t2.condition_1 = t1.c1;
Run Code Online (Sandbox Code Playgroud)
子查询根据您的排序条件table2为每个找到一条记录condition_1;然后该单行可以连接到单行table1(假设c1是唯一的)。
或者您可以使用分析函数:
select r1, r2, r3
from (
select t1.r1, t2.r2, t1.r3,
row_number() over (partition by t2.condition_1
order by t2.condition_2 desc) as rn
from table1 t1
join table2 t2 on t2.condition_1 = t1.c1
)
where rn = 1;
Run Code Online (Sandbox Code Playgroud)
这将连接两个表,然后table2根据分析函数的窗口子句中的排序条件,通过查看已连接的结果集来决定保留哪些值。单独运行的内部查询会产生您之前尝试加入时看到的内容,所有“重复”(在结果集中不是真正的重复,而是每个r1/r3对来自的多行table1),以及一个rn排名的附加列这些重复项中的那些结果集行;然后外部查询将其过滤为仅显示排名第一的行。
如果condition_2不是唯一的,那么您需要决定如何处理关系 - 如果相同和组合table2可以有两个r2值。在这种情况下,您可以查看不同的分析函数 -例如。condition_1condition_2rank