从顶部查询访问列

时间:2013-12-08 17:22:06

标签: sql oracle oracle11g

我尝试运行以下查询:

select * 
  from tbl1
 where tbl1.clmn = (select * 
                      from (select val 
                              from tbl2 
                             where tbl2.clmn2 = tbl1.val
                             order by tbl2.order)
                     where rownum <=1)

但是在子查询中无法访问tbl1.val。有可能解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

是的,您必须将子查询转换为加入。

SELECT *
FROM tbl1 t1 INNER JOIN (
  SELECT * FROM (SELECT * FROM tbl2 ORDER BY tbl2.order) t WHERE t.rownum <= 1
) t2 ON t2.clmn2=t1.val

你可能需要让它适用于Oracle,但通常你应该这样做。

答案 1 :(得分:0)

在12c之前的oracle中,我们可以引用相关子查询中的一个表,该子查询只有一个深度,不再是(ANSI标准)。但是,在12c中,我们可以超过2级。因此,在您的情况下,如果您反对表加入,则可以按如下方式重写两级相关子查询:

select *
  from tbl1
 where tbl1.clmn = (select max(tbl2.val) keep(dense_rank first 
                                                   order by tbl2.order)
                      from tbl2
                     where tbl2.clmn2 = tbl1.val )