2

请帮我做一个oracle存储过程;我有两张桌子

tblLead:

lead_id Name
1        x
2        y
3        z

交易:

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 ! 
4

2 回答 2

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
于 2010-06-07T08:01:17.067 回答
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 
------
------;

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

于 2010-06-07T07:44:41.763 回答