我尝试运行以下查询:
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
。有可能解决这个问题吗?
答案 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 )