Oracle 如何将主查询列传递给嵌套的子查询?

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语句中嵌套了查询,如下所示

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行的重复行。是否有替代子查询的方法?