2010-06-07 33 views
2

请帮我做一个oracle存储过程;我有两个表Oracle以最新状态加入两个表的过程

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 

我要像

lead_id Name status 

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

任何特殊原因要求存储过程?它可以用普通的SQL编写。 – Sujee 2010-06-07 07:37:28

回答

1

它可以在普通的SQL写成如下,

结果
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; 

或者你可能会觉得写一个观点如下,

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

我个人认为存储过程并不需要这样的场景。

+0

它们显然不是1对1的 - 你有两行'lead_id = 1',OP期望最大'Tran_id'。 – Kobi 2010-06-07 07:47:29

+0

是的。谢谢@Kobi。我没有注意到它。 – Sujee 2010-06-07 07:55:35

+0

查询被重写,因为测试数据显示关系不是一对一。 – Sujee 2010-06-07 08:11:37

4

使用外连接到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 

或者您可以使用分析:

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

用于第一个查询 – 2010-06-07 11:25:44