Последние 24 часа обновляли записи из таблицы с использованием Oracle SQL? - PullRequest
1 голос
/ 28 июля 2011

У меня есть запрос Pl / SQL, который извлекает все записи из 3 таблиц.Это хорошо.Теперь я хочу получить последние 24 обновленные записи из 2 таблиц (tbl_constit, tbl_email).

См. Ниже фактический запрос

SELECT DISTINCT c.constit_id AS constitid,
               REPLACE (c.in_labelname, 'None', '') AS fullname,
               c.firstname AS firstname, c.lastname AS lastname,
               c.indiv_title AS title, e.e_addr AS email,
              'InActive' AS status                               
          FROM tbl_constit cn, tbl_email e,tbl_catcod s
         WHERE c.constit_id = e.constit_id
           AND c.constit_id = s.constit_id(+)
           AND e.e_type = 'EMAIL'
           AND e.e_default = '1'
           AND s.cat_code IN ('SPEMU', 'SPENM')              
      ORDER BY c.constit_id;

таблиц tbl_constit cn, tbl_email e имеет поле 'CHGD_DT'.

Это поле даты изменяется при обновлении записи. Теперь Как я могу извлечь последние 24 обновленные записи из tbl_constit cn или tbl_email, используя поле 'CHGD_DT'?

Изменение может произойти в любой из двух таблиц.

Ответы [ 4 ]

4 голосов
/ 28 июля 2011
SELECT DISTINCT c.constit_id AS constitid,
               REPLACE (c.in_labelname, 'None', '') AS fullname,
               c.firstname AS firstname, c.lastname AS lastname,
               c.indiv_title AS title, e.e_addr AS email,
              'InActive' AS status                               
          FROM tbl_constit cn, tbl_email e,tbl_catcod s
         WHERE c.constit_id = e.constit_id
           AND c.constit_id = s.constit_id(+)
           AND e.e_type = 'EMAIL'
           AND e.e_default = '1'
           AND s.cat_code IN ('SPEMU', 'SPENM')
           AND ((cn.chgd_dt > (SYSDATE - 1)) OR (e.chgd_dt > (SYSDATE - 1)))
      ORDER BY c.constit_id;

Это покажет все строки, где cn или e были обновлены за последние 24 часа, если вы хотите показать строки, где оба были обновлены, замените внутреннее ИЛИ на AND.

2 голосов
/ 28 июля 2011

То, что вы хотите, это SYSDATE - 1, вот так:

 SELECT DISTINCT c.constit_id AS constitid,
           REPLACE (c.in_labelname, 'None', '') AS fullname,
           c.firstname AS firstname, c.lastname AS lastname,
           c.indiv_title AS title, e.e_addr AS email,
          'InActive' AS status                               
      FROM tbl_constit cn, tbl_email e,tbl_catcod s
     WHERE c.constit_id = e.constit_id
       AND c.constit_id = s.constit_id(+)
       AND e.e_type = 'EMAIL'
       AND e.e_default = '1'
       AND s.cat_code IN ('SPEMU', 'SPENM')              
       AND cn.CHGD_DT > SYSDATE - 1
  ORDER BY c.constit_id;

Это условие получит все, где CHGD_DT больше, чем дата прямо сейчас (минус 1 день, то есть вчера).

1 голос
/ 28 июля 2011
SELECT *
FROM
(
       select DISTINCT
              c.constit_id AS constitid,
               REPLACE (c.in_labelname, 'None', '') AS fullname,
               c.firstname AS firstname, c.lastname AS lastname,
               c.indiv_title AS title, e.e_addr AS email,
              'InActive' AS status                               
          FROM tbl_constit cn, tbl_email e,tbl_catcod s
         WHERE c.constit_id = e.constit_id
           AND c.constit_id = s.constit_id(+)
           AND e.e_type = 'EMAIL'
           AND e.e_default = '1'
           AND s.cat_code IN ('SPEMU', 'SPENM')   
         ORDER BY GREATEST (cn.CHGD_DT, e.CHGD_DT)
        )            
WHERE rownum <= 24 
ORDER BY c.constit_id;
1 голос
/ 28 июля 2011

Предполагается, что вы имеете в виду «строки, которые изменились за последние 24 часа», как подразумевает заголовок, а не «последние 24 обновленные записи», что означает, что вы хотите, чтобы ровно 24 строки были возвращены независимо от того, когда они были изменены, что-то вроде

SELECT DISTINCT c.constit_id AS constitid,
               REPLACE (c.in_labelname, 'None', '') AS fullname,
               c.firstname AS firstname, c.lastname AS lastname,
               c.indiv_title AS title, e.e_addr AS email,
              'InActive' AS status                               
          FROM tbl_constit cn, tbl_email e,tbl_catcod s
         WHERE c.constit_id = e.constit_id
           AND c.constit_id = s.constit_id(+)
           AND e.e_type = 'EMAIL'
           AND e.e_default = '1'
           AND s.cat_code IN ('SPEMU', 'SPENM')              
           AND greatest( cn.chgd_dt, e.chgd_dt ) > sysdate - interval '1' day
      ORDER BY c.constit_id;

или

SELECT DISTINCT c.constit_id AS constitid,
               REPLACE (c.in_labelname, 'None', '') AS fullname,
               c.firstname AS firstname, c.lastname AS lastname,
               c.indiv_title AS title, e.e_addr AS email,
              'InActive' AS status                               
          FROM tbl_constit cn, tbl_email e,tbl_catcod s
         WHERE c.constit_id = e.constit_id
           AND c.constit_id = s.constit_id(+)
           AND e.e_type = 'EMAIL'
           AND e.e_default = '1'
           AND s.cat_code IN ('SPEMU', 'SPENM')    
           AND (cn.chgd_dt > sysdate - interval '1' day OR
                e.chgd_dt  > sysdate - interval '1' day)          
      ORDER BY c.constit_id;

Последнее может быть более эффективным, если CHGD_DT проиндексировано в любой таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...