2017-09-07 7 views
0

J'ai deux tables qui contient des données commeCertaines déclaration de cas question

table1

Id id_nm 
1 per 
2 per 
3 org 

table2

Id Lst_id l_nm up_dt 
1 22 abc 9/10/2015 
1 21 abs 10/12/2016 
2 21 xzc 10/12/2013 
2 23 xyz 10/21/2013 
2 23 xnh 01/12/2013 

besoin de choisir le l_nmlst_id est 22. Si ce n'est pas présente alors nous devons choisir le l_nm avec la date mise à jour la plus récente.

Id lst_id lnm up_dt 
1 22 abc 9/10/2015 
2 23 xyz 10/21/2013 

peut-on m'aider s'il vous plaît dans la mise en œuvre.

+0

S'il vous plaît nous montrer votre procédure stockée –

+0

Comme pour ID1 j'ai deux entrées table2 i doivent remplir uniquement les les valeurs doivent avoir lst_id comme 22. Mais pour Id 2 je n'ai pas lst_is comme 22 donc j'ai des données de diplay qui ont max up_dt. et besoin de rejoindre la table1 avec la table 2 pour obtenir toutes les données. Je l'ai essayé avec la création de différents blocs aussi et son fonctionnement. Mais je veux quelque chose qui peut être fait dans un bloc. – Jig232

+0

Je n'ai pas de procédure. – Jig232

Répondre

0

Une façon simple est d'utiliser row_number avec une clause de fenêtre pour générer un ordre de tri personnalisé:

select id, lst_id, l_nm as lnm, up_dt 
from (
    select id 
     ,lst_id 
     ,l_nm 
     ,up_dt 
     ,row_number() 
     over (partition by id 
       order by case when lst_id = 22 then 1 else 2 end 
         ,up_dt desc) as rn  
    from table2 
) where rn = 1; 
+0

J'ai essayé mais ça ne fonctionne pas comme je le veux. – Jig232

+0

'créer ou remplacer vue test_mv (id, id_nm, lst_id, l_nm, up_dt) comme sélectionnez vw.id, vw.t1b, vw.t2b, vw.l_nm, vw.up_dt de (sélectionnez t1.id, t1. id_nm t1b, t2.id_nm t2b, t2.l_nm, t2.up_dt, row_number() sur (partition par t2.id ordre par cas lorsque t2.lst_id = 22 puis 1 sinon 2 fin, t2.up_dt desc) rn depuis table1 t1, table2 t2 où t1.id = t2.id ) où vw.rn = 1; ; ' –

+0

@ Jig232 que voulez-vous dire" ne fonctionne pas "? Quel résultat avez-vous obtenu? –