2010-06-07 4 views
2

S'il vous plaît aidez-moi à faire une procédure stockée oracle; J'ai deux tablesOracle Procédure pour joindre deux tables avec le dernier état

tblLead:

lead_id Name 
1  x 
2  y 
3  z 

tblTransaction:

Tran_id lead_id date   status 

1   1  04/20/2010 call Later 
2   1  05/05/2010 confirmed 

Je veux un résultat comme

lead_id Name status 

1   x  confirmed 
2   y  not available ! 
3   z  not available ! 
+0

une raison particulière pour demander une procédure stockée? il peut être écrit en langage SQL. – Sujee

Répondre

1

Il peut être écrit en SQL comme suit,

SELECT lead_id, name, NVL(status,'not available !') 
FROM ( 

SELECT tblLead.lead_id, tblLead.name, tblTransaction.status, 
rank () OVER (PARTITION BY tblTransaction.lead_id ORDER BY tblTransaction.datee DESC, tblTransaction.tran_id DESC) rank 
FROM tblLead 
LEFT JOIN tblTransaction ON tblLead.lead_id = tblTransaction.lead_id 
) 
WHERE rank = 1 
ORDER BY lead_id; 

Ou vous pouvez penser à écrire une vue comme suit,

CREATE VIEW trx_view AS 
------ 
------; 

Personnellement, je pense que la procédure stockée est pas nécessaire pour les scénarios comme celui-ci.

+0

Ils ne sont clairement pas 1-à-1 - vous avez deux lignes avec 'lead_id = 1', et l'OP attend celui avec max' Tran_id'. – Kobi

+0

oui. Merci @Kobi. Je ne l'ai pas remarqué. – Sujee

+0

La requête a été réécrite parce que les données de test montrent que la relation n'est pas biunivoque. – Sujee

4

une jointure externe aux lignes pertinentes de tblTransaction:

SQL> SELECT l.lead_id, l.NAME, 
    2   CASE 
    3   WHEN t.status IS NULL THEN 
    4    'N/A' 
    5   ELSE 
    6    t.status 
    7   END status 
    8 FROM tbllead l 
    9 LEFT JOIN (SELECT lead_id, 
10      MAX(status) KEEP(DENSE_RANK FIRST 
11          ORDER BY adate DESC) status 
12     FROM tbltransaction 
13    GROUP BY lead_id) t ON l.lead_id = t.lead_id; 

    LEAD_ID NAME STATUS 
---------- ---- ---------- 
     1 x confirmed 
     2 y N/A 
     3 z N/A 

vous pouvez également utiliser l'analyse:

SQL> SELECT lead_id, NAME, status 
    2 FROM (SELECT l.lead_id, l.NAME, 
    3     CASE 
    4      WHEN t.status IS NULL THEN 
    5      'N/A' 
    6      ELSE 
    7      t.status 
    8     END status, 
    9     row_number() 
10      over(PARTITION BY l.lead_id ORDER BY t.adate DESC) rn 
11    FROM tbllead l 
12    LEFT JOIN tbltransaction t ON l.lead_id = t.lead_id) 
13 WHERE rn = 1; 

    LEAD_ID NAME STATUS 
---------- ---- ---------- 
     1 x confirmed 
     2 y N/A 
     3 z N/A 
+0

+1 pour la première requête –

Questions connexes