在oracle中使用子查询更新/合并表

在oracle中使用子查询更新/合并表,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,我有一个下表-帐户详细信息 Account_No Request_Id Issue_date Amount Details 1 567 20150607 $156 Loan 2 789 20170406 $765 Personal 3 20170216 $897 3

我有一个下表-帐户详细信息

 Account_No   Request_Id   Issue_date    Amount   Details
   1              567       20150607      $156     Loan
   2              789       20170406      $765     Personal
   3                        20170216      $897     
   3              987       20160525      $345     Loan
   3              456       20170112      $556     Loan
   4              234       20171118      $987     Loan
对于具有以下逻辑的帐户,我必须更新请求id为null或详细信息为null的请求id。 需要根据发布日期获取帐户的最新请求id,并且必须更新请求id(最新请求id+1),其中请求id为null或详细信息为null。所以结果应该是

 Account No   Request_Id   Issue_date    Amount   Details
   1              567       20150607      $156     Loan
   2              789       20170406      $765     Personal
   3              457       20170216      $897     
   3              987       20160525      $345     Loan
   3              456       20170112      $556     Loan
   4              234       20171118      $987     Loan
我尝试了下面的查询

MERGE INTO AccountDetails a
USING ( select Request_Id + 1,ROW_NUMBER() OVER (PARTITION BY B.Account_No 
ORDER BY B.Issue_date desc) AS RANK_NO 
          from AccountDetails ) b
ON ( a.Account_No = b.Account_No AND a.DETAILS IS  NULL)
WHEN MATCHED THEN 
UPDATE SET  a.Request_Id = b.Request_Id
WHERE B.RANK_NO = 1;

听起来您需要使用分析滞后函数来确定前一行的请求id,例如:

MERGE INTO account_details tgt
  USING (SELECT account_no,
                CASE WHEN request_id IS NULL THEN 1 + LAG(request_id) OVER (PARTITION BY account_no ORDER BY issue_date)
                     ELSE request_id
                END request_id,
                issue_date,
                amount,
                DETAILS,
                ROWID r_id
         FROM   accountdetails) src
    ON (tgt.rowid = src.r_id)
WHEN MATCHED THEN
  UPDATE SET tgt.request_id = src.request_id;

当然,这种设计似乎有点奇怪——为什么首先请求id为null?这是一个独特的专栏吗?如果是这样的话,如果您最终用替换id复制了现有的请求id,会发生什么情况?此外,如果账号的第一行请求id为空,会发生什么情况?

听起来您需要使用分析滞后函数来确定前一行的请求id,例如:

MERGE INTO account_details tgt
  USING (SELECT account_no,
                CASE WHEN request_id IS NULL THEN 1 + LAG(request_id) OVER (PARTITION BY account_no ORDER BY issue_date)
                     ELSE request_id
                END request_id,
                issue_date,
                amount,
                DETAILS,
                ROWID r_id
         FROM   accountdetails) src
    ON (tgt.rowid = src.r_id)
WHEN MATCHED THEN
  UPDATE SET tgt.request_id = src.request_id;
当然,这种设计似乎有点奇怪——为什么首先请求id为null?这是一个独特的专栏吗?如果是这样的话,如果您最终用替换id复制了现有的请求id,会发生什么情况?另外,如果它是帐号的第一行,并且请求id为空,该怎么办