2017-09-03 2 views
0

J'ai un tableau ci-dessous - AccountDetailsMise à jour/Fusionner une table à l'aide sous requête dans Oracle

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 

Je dois mettre à jour le request_id où id demande est nulle ou Détails est nulle pour le compte ci-dessous logique. Nécessité d'obtenir le dernier ID de demande pour le compte en fonction de la date de publication et de mettre à jour l'ID de demande (dernier ID de demande + 1) WHERE request_id est nul ou les détails sont NULL. Ainsi, le résultat devrait être

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 

J'ai essayé avec la requête ci-dessous

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; 

Répondre

1

On dirait que vous devez utiliser la fonction LAG analytique pour déterminer la request_id de la ligne précédente, par exemple:

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; 

Bien sûr, cette conception semble un peu étrange - pourquoi request_id null en premier lieu? Est-ce une colonne unique? Si oui, que se passe-t-il si vous finissez par dupliquer un request_id existant avec votre identifiant de remplacement? De plus, que se passe-t-il s'il s'agit de la première ligne d'un numéro de compte dont le numéro de demande est null?

0
update accountdetails set request_id=(select max(request_id)+1 from accountdetails) 
    where request_id is null and details is null;