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

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子查询中的子查询?

在这种情况下,有人可以帮助我吗?

Ale*_*ole 5

您只能引用低至一级子查询的对象,因此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排名的附加列这些重复项中的那些结果集行;然后外部查询将其过滤为仅显示排名第一的行。

两种方法的 SQL Fiddle 演示

如果condition_2不是唯一的,那么您需要决定如何处理关系 - 如果相同和组合table2可以有两个r2值。在这种情况下,您可以查看不同的分析函数 -例如。condition_1condition_2rank