2

従業員とその従業員のシステムへのアクセスに関する情報を含むマテリアライズド ビュー テーブルがあります。テーブルには「effective_date」列と「effective_date_to」列があります。このマテリアライズド ビューは毎晩 1 回更新されます。

このテーブルに「current_flag」列を追加して、現在の従業員がアクセス権を持っているかどうかを「Y」または「N」で示したいと思います。次のような「ケース」ステートメントを使用することを考えています:-

CASE WHEN  to_date(c.effective_date) < to_date(sysdate) 
and to_date      (effective_date_to) > to_date(sysdate)
THEN  'Y'
   ELSE 'N'            
END) AS current_flag

これが最善の方法ですか?そうであれば、これを機能させるのに苦労しているため、正しい構文は何ですか..

元のマテリアライズド ビュー テーブルは以下のとおりです...

CREATE MATERIALIZED VIEW TC.employee_access 

(
EMPL_ID,
EFFECTIVE_DATE,
EFFECTIVE_DATE_TO,
DEPARTMENT,
JOB_DESCRIPTION,
TIME_STAMP,
MODIFIED_BY
)
TABLESPACE TC_TC_DATA
PCTUSED    0
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOCACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH FORCE
START WITH TO_DATE('16-Jan-2013','dd-mon-yyyy')
NEXT TRUNC(SYSDATE+1)
WITH PRIMARY KEY
AS 

SELECT C.EMPL_ID AS Empl_Id,
       C.EFFECTIVE_DT AS Effective_Date,
       DECODE (n.effective_dt,
               c.effective_dt, TO_DATE ('01/01/2099', 'DD/MM/YYYY'),
               n.effective_dt - 1)
              AS Effective_Date_To,
       C.DFLT_UDT06_ID AS Department,     
       C.DFLT_UDT08_ID AS Job_Description,
       C.TIME_STAMP,
       C.MODIFIED_BY
  FROM empl_history_mv c, empl_history_mv n
 WHERE n.effective_dt =
          (SELECT NVL (MIN (effective_dt), c.effective_dt)
             FROM empl_history_mv
            WHERE empl_id = c.empl_id AND effective_dt > c.effective_dt)
       AND c.empl_id = n.empl_id;
4

2 に答える 2

0

あなたが持っている余分なブラケットと、誤ったto_Date()それは私には有効に見えます。

つまり、これを試しましたか?

CREATE MATERIALIZED VIEW TC.employee_access 
(
EMPL_ID,
EFFECTIVE_DATE,
EFFECTIVE_DATE_TO,
DEPARTMENT,
JOB_DESCRIPTION,
TIME_STAMP,
MODIFIED_BY,
current_flag
)
...
WITH PRIMARY KEY
AS 

SELECT C.EMPL_ID AS Empl_Id,
       C.EFFECTIVE_DT AS Effective_Date,
       DECODE (n.effective_dt,
               c.effective_dt, TO_DATE ('01/01/2099', 'DD/MM/YYYY'),
               n.effective_dt - 1)
              AS Effective_Date_To,
       C.DFLT_UDT06_ID AS Department,     
       C.DFLT_UDT08_ID AS Job_Description,
       C.TIME_STAMP,
       C.MODIFIED_BY,
       CASE WHEN c.effective_date < sysdate
                 and effective_date_to > sysdate
       THEN  'Y'
       ELSE 'N'            
       END as current_flag
  FROM empl_history_mv c, empl_history_mv n
 ....
于 2013-01-15T07:59:07.577 に答える
0

CASE-statement は、計算された value にアクセスする必要がありますeffective_date_to。ブラケットの追加セットを使用してこれを行うことができます。

SELECT empl_id,
       effective_date,
       effective_date_to,
       CASE WHEN effective_date < SYSDATE AND SYSDATE < effective_date_to
            THEN 'Y' ELSE 'N' END current_flag
  FROM (
        SELECT c.empl_id
               c.effective_dt as effective_date,
          FROM ...
       );

または、ロジックを 1 つのクエリに展開します。

SELECT c.empl_id, 
       c.effective_dt as effective_date,
       NVL2(n.effective_dt, n.effective_dt - 1, DATE'2099-01-01') AS effective_date_to,
       CASE WHEN c.effective_dt <= sysdate
             AND (sysdate < n.effective_dt OR n.effective_dt IS NULL) 
            THEN 'Y' ELSE 'N' END AS current_flag
  FROM empl_history_mv c
  LEFT JOIN empl_history_mv n 
    ON c.empl_id = n.empl_id
   AND c.effective_dt < n.effective_dt
   AND NOT EXISTS (
       SELECT * 
         FROM empl_history_mv t
        WHERE c.empl_id = t.empl_id
          AND c.effective_dt < t.effective_dt
          AND t.effective_dt < n.effective_dt
       );
于 2013-01-15T08:39:27.460 に答える