Oracle 如何将主查询列传递给嵌套的子查询?
我正在编写一个查询,它在select语句中嵌套了查询,如下所示Oracle 如何将主查询列传递给嵌套的子查询?,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,我正在编写一个查询,它在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 我试图将主查询对象传递到s
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
我试图将主查询对象传递到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;
子查询根据您的订购条件,为每个条件_1
查找一条表2
记录;然后该单行可以从表1
连接到一行(假设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;
这将联接两个表,然后根据分析函数的windowing子句中的排序条件,通过查看已联接的结果集来确定要保留的table2
值。内部查询单独运行将产生您以前尝试连接时看到的结果,其中包含所有“重复项”(在结果集中不是真正重复的,而是来自表1
的每个/r3
对的多行),并添加一个rn
列,对这些重复项中的结果集行进行排序;然后外部查询筛选出只显示排名第一的行
如果条件_2
不是唯一的,那么您需要决定如何处理关系-如果表2
可以为相同的条件_1
和条件_2
组合使用两个r2
值。在这种情况下,你可以看一个不同的分析函数-rank
。我知道它有点旧,但它可能会帮助其他人。您可以从子查询中取出where子句,并将该子句保留在可访问的位置
Select t1.R1,
(
select * from
(
select t2.R2
from table2 t2
) x
where x.Condition_1=t1.C1
order by x.Condition_2 desc
)
where rownum=1
),
t1.R3
from table1 t1
您只能将对象引用到子查询的一个级别,因此内部子查询中无法识别t1
。为什么使用子查询而不是联接?嗨,Alex,谢谢你的回复。我之所以使用子查询,是因为我正在调用的table2对于我需要获取最新更新日期行的每个ID都有重复的行。我尝试使用联接,但它会额外提供大约300行的重复行。是否有替代子查询的方法?