2013-01-15 29 views
2

我有一個物化視圖表,其中包含員工及其對系統的訪問信息 該表具有「effective_date」列和「effective_date_to」列,該物化視圖每晚更新一次使用case語句的oracle查詢的問題

我想添加一個額外的列「current_flag」到這個表來顯示當前員工是否有權訪問「Y」或「N」 我在考慮使用「case」聲明如下所示: -

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; 
+1

SYSDATE是Date類型,你不必做TO_DATE (sysdate) –

+0

你得到什麼錯誤?請發佈ORA錯誤消息。 –

+1

在已經是日期的列上使用'to_date()'是完全沒有用的(並不是說沒有意義)。 –

回答

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 
.... 
0

語句來需要你的計算值effective_date_to訪問的CASE。您可以用一組額外的括號做到這一點:

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 ... 
     ); 

或者你鋪開邏輯到一個查詢:

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 
     );