Update/Merge a table 在 oracle 中使用子查询
Update/Merge a table using sub query in oracle
我有以下 table - 帐户详细信息
Account_No Request_Id Issue_date Amount Details
1 567 20150607 6 Loan
2 789 20170406 5 Personal
3 20170216 7
3 987 20160525 5 Loan
3 456 20170112 6 Loan
4 234 20171118 7 Loan
我必须使用以下逻辑更新帐户的请求 ID 为空或详细信息为空的 request_id。
需要根据发布日期获取帐户的最新请求 ID,并且必须更新请求 ID(最新请求 ID + 1),其中 request_id 为空或详细信息为空。所以结果应该是
Account No Request_Id Issue_date Amount Details
1 567 20150607 6 Loan
2 789 20170406 5 Personal
3 457 20170216 7
3 987 20160525 5 Loan
3 456 20170112 6 Loan
4 234 20171118 7 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;
update accountdetails set request_id=(select max(request_id)+1 from accountdetails)
where request_id is null and details is null;
听起来您需要使用解析 LAG 函数来确定上一行的 request_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;
当然,这个设计看起来有点奇怪 - 为什么 request_id 首先是 null?它是一个独特的专栏吗?如果是这样,如果您最终用替换 ID 复制现有的 request_id 会怎样?此外,如果它是空帐号的第一行 request_id?
,应该会发生什么
我有以下 table - 帐户详细信息
Account_No Request_Id Issue_date Amount Details
1 567 20150607 6 Loan
2 789 20170406 5 Personal
3 20170216 7
3 987 20160525 5 Loan
3 456 20170112 6 Loan
4 234 20171118 7 Loan
我必须使用以下逻辑更新帐户的请求 ID 为空或详细信息为空的 request_id。 需要根据发布日期获取帐户的最新请求 ID,并且必须更新请求 ID(最新请求 ID + 1),其中 request_id 为空或详细信息为空。所以结果应该是
Account No Request_Id Issue_date Amount Details
1 567 20150607 6 Loan
2 789 20170406 5 Personal
3 457 20170216 7
3 987 20160525 5 Loan
3 456 20170112 6 Loan
4 234 20171118 7 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;
update accountdetails set request_id=(select max(request_id)+1 from accountdetails)
where request_id is null and details is null;
听起来您需要使用解析 LAG 函数来确定上一行的 request_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;
当然,这个设计看起来有点奇怪 - 为什么 request_id 首先是 null?它是一个独特的专栏吗?如果是这样,如果您最终用替换 ID 复制现有的 request_id 会怎样?此外,如果它是空帐号的第一行 request_id?
,应该会发生什么