我正在编写一个查询,它在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
列传递给子查询中的子查询?
在这种情况下,请帮助我吗?
答案 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