【问题标题】:Last 24 hours updated records from table using Oracle SQL?过去 24 小时使用 Oracle SQL 从表中更新记录?
【发布时间】:2011-10-15 06:52:11
【问题描述】:

我有一个从 3 个表中提取所有记录的 Pl/SQL 查询。那很好。现在我想从 2 个表 (tbl_constit, tbl_email) 中提取最后 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')              
      ORDER BY c.constit_id;

tables tbl_constit cn, tbl_email e 有 'CHGD_DT' 字段。

当记录更新时,此日期字段会发生变化。 现在如何使用 'CHGD_DT' 字段从 tbl_constit cn 或 tbl_email 中提取最近 24 条更新记录?

更改可以发生在两个表中的任何一个。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案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)) OR (e.chgd_dt > (SYSDATE - 1)))
          ORDER BY c.constit_id;
    

    这将显示过去 24 小时内更新了 cn 或 e 的所有行,如果您想显示同时更新的行,请将内部 OR 替换为 AND。

    【讨论】:

      【解决方案2】:

      你要的是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 天,因此是昨天)。

      【讨论】:

        【解决方案3】:

        假设您的意思是“在过去 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 在任一表中被索引,后者可能更有效。

        【讨论】:

          【解决方案4】:
          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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-21
            • 2014-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多