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

时间:2014-07-21 09:11:14

标签: 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 

我正在尝试将主查询对象传递到select语句中的子查询内的子查询。

当我执行此操作时,我在t1.C1处收到对象无效错误。

我能够将主表table1的对象传递给第一个子查询,但是如何将table1列传递给子查询中的子查询?

在这种情况下,请帮助我吗?

2 个答案:

答案 0 :(得分:4)

您只能将对象引用到一个子查询级别,因此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;

子查询根据您的订购标准为每个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;

这将连接两个表,然后根据分析函数窗口子句中的排序条件,通过查看已加入的结果集来决定保留哪个table2值。自己运行的内部查询会生成您之前尝试加入时所看到的内容,并且所有的重复内容都会生成。 (在结果集中不是真正的重复,但是来自r1的每个r3 / table1对的多行),并且添加了rn列,用于对这些结果集行进行排名那些重复;外部查询然后过滤它以仅显示排名第一的行。

SQL Fiddle demo of both approaches

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

答案 1 :(得分:0)

我知道它有点旧,但它可能会帮助别人。您可以从子子查询中取出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