如何使用更新在嵌套子查询中使用外部查询变量?

How can I use an outer query variable in a nested sub query using update?

update fee_schedule fs set fs.branch_id=
(
SELECT  branch_id  FROM   (SELECT  branch_id
                                       ,updated_ts
                                       ,gr_number
                                      ,row_number() OVER (PARTITION BY gr_number ORDER BY updated_ts desc) AS sno
                                FROM   admission_log ) x
                       WHERE  x.gr_number = fs.gr_number and to_char(x.updated_ts,'yyyymm') < fs.schedule_month
                       and rownum=1
                       order by sno
)
where fs.branch_id is null ;

SQL Error: ORA-00907: missing right parenthesis 00907. 00000 - "missing right parenthesis"

我尝试使用同样的东西:

update fee_schedule fs set fs.branch_id=
(
select c.branch_id
      from (select b.branch_id,updated_ts,
                   row_number() over(PARTITION by b.gr_number order by b.updated_ts desc) as Sno
                   from admission_log b
                   where b.gr_number = fs.gr_number and to_char(b.updated_ts,'yyyymm') <  fs.schedule_month ) c
      where c.sno = 1
)
where fs.branch_id is null ;

我发现了这个错误:

SQL Error: ORA-00904: "FS"."SCHEDULE_MONTH": invalid identifier

您可以使用 keep:

update fee_schedule fs
    set fs.branch_id =
            (select max(b.branch_id) keep (dense_rank first order by updated_ts desc)
              from admission_log al
                   where al.gr_number = fs.gr_number and
                         to_char(al.updated_ts, 'yyyymm') < fs.schedule_month 
            )
where fs.branch_id is null ;

此结构等同于 "first()" 聚合函数,可以方便地绕过 Oracle 对相关子查询的作用域限制。