Процедура Oracle для объединения двух таблиц с последним статусом - PullRequest
2 голосов
/ 07 июня 2010

Пожалуйста, помогите мне сделать хранимую процедуру оракула; У меня есть две таблицы

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 ! 

Ответы [ 2 ]

4 голосов
/ 07 июня 2010

Используйте внешнее соединение с соответствующими строками 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
1 голос
/ 07 июня 2010

Он может быть написан на простом 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 
------
------;

Лично я считаю, что хранимая процедура не нужна для подобных сценариев.

...