2017-10-12 20 views
1

Je me bats pour faire un script de mise à jour qui fonctionne avec les données suivantes:Mettre à jour un champ du tableau 1 en fonction des critères du tableau 2? ORACLE

TOWER_PAYMENT TABLE           
============================================================== 
PAY_PERIOD|TOWER_ID|APARTMENT_NUM|MONTH_PAYMENT|PAYMENT_STATUS  
201703 |10  |101   |700   |NULL 
201704 |10  |101   |700   |NULL 
201703 |10  |102   |700   |NULL 
201704 |10  |102   |700   |NULL     
201703 |20  |101   |800   |NULL  
201704 |20  |101   |800   |NULL    
201703 |20  |102   |800   |NULL  
201704 |20  |102   |800   |NULL    

PAYMENT_STATUS TABLE 
============================================== 
PAY_PERIOD|TOWER_ID|APARTMENT_NUM|PAYMENT_DONE 
201703 |10  |101   |700 
201704 |10  |101   |400 
201703 |10  |102   |500 
201704 |10  |102   |700 
201703 |20  |101   |800 

Je cherche à mettre à jour le champ « PAYMENT_STATUS » avec un certain nombre en fonction de différents critères:

  • Si un "APARTMENT_NUM" appartenant à un "TOWER_ID" se trouve dans la table "PAYMENT_STATUS" correspondant à "PAY_PERIOD", mettez à jour le champ "PAYMENT_STATUS" à 1.
  • Si le "APARTMENT_NUM" appartenant à un "TOWER_ID" est introuvable dans la table "PAYMENT_STATUS" pour la correspondance "PAY_PERIOD", puis mise à jour le champ « PAYMENT_STATUS » à 2.
  • Si le champ « APARTMENT_NUM » ont un « PAYMENT_DONE » moins que « MONTH_PAYMENT », puis mettre à jour le « PAYMENT_STATUS » à 3.

La sortie souhaitée doit être:

TOWER_PAYMENT 
====================================================================  
PAY_PERIOD|TOWER_ID|APARTMENT_NUM|MONTH_PAYMENT|PAYMENT_STATUS  
201703 |10  |101   |700   |1 
201704 |10  |101   |700   |3 
201703 |10  |102   |700   |3 
201704 |10  |102   |700   |1     
201703 |20  |101   |800   |1  
201704 |20  |101   |800   |2    
201703 |20  |102   |800   |2  
201704 |20  |102   |800   |2    

J'ai essayé avec MERGE INTO mais je n'ai pas pu mettre à jour quand je ne correspondais pas.

Merci d'avance!

+0

Qu'avez-vous essayé? Cela semble être assez facile en utilisant une jointure externe et une déclaration de cas. –

+0

Ceci est un terrible modèle de données. Pourquoi affichez-vous un drapeau dans la première table, qui deviendra immédiatement incorrect lorsque quelqu'un effectue un paiement? Ou quand un de vos propres opérateurs corrigera une erreur qu'ils ont faite lorsqu'ils ont tapé les données dans la deuxième table? Pourquoi avez-vous même deux tables pour commencer - le "paiement reçu" pourrait aussi bien être dans la première table! – mathguy

+0

1.- J'ai essayé avec MERGE INTO avec l'approche JOIN mais je n'ai pas trouvé de moyen de mettre à jour quand l'appartement ne se trouve pas sur la table PAYMENT_STATUS. 2.- Je suis actuellement bloqué avec ce modèle de données terrible, malheureusement je ne peux pas le changer :( – Rycerzfrost

Répondre

2
UPDATE tower_payment 
    SET payment_status = CASE 
           WHEN (SELECT payment_done 
             FROM payment_status 
            WHERE tower_payment.apartment_num = payment_status.apartment_num) < month_payment 
           THEN 
            3 
           WHEN (SELECT payment_done 
             FROM payment_status 
            WHERE tower_payment.apartment_num = payment_status.apartment_num) 
             IS NULL 
           THEN 
            2 
           ELSE 
            1 
          END; 
+0

A fonctionné assez bien!, Mais j'ai dû ajouter "AND ROWNUM <= 1" aux clauses WHERE pour éviter le "SQL Erreur: ORA-01427 "Merci pour l'aide !! – Rycerzfrost