2017-03-17 63 views
1

我有兩個表2017和2018.兩個表具有相同的列,但值不同。我希望獲得每列的不同值,並且我希望確保2018年的所有獨特列在2017年出現。我在每張表中都有超過100列。我用光標嘗試了下面的查詢。其結果將被存儲在一個名爲「RESULT_MINUS」提前使用光標獲取不同的值

DECLARE 
    COL   VARCHAR2 (200); 
    OUTRECORD VARCHAR2 (200); 

    CURSOR COLUMN_NM 
    IS 
     SELECT COLUMN_NAME 
     FROM all_tab_columns 
     WHERE  table_name = 'COMPARE_2018_P1' 


    CURSOR DIFFERENCE 
    IS 
     SELECT OUTRECORD 
     FROM (SELECT DISTINCT COL 
       FROM COMPARE_2018_P1 
       MINUS 
       SELECT DISTINCT COL 
       FROM COMPARE_2017_P1); 
BEGIN 
    OPEN COLUMN_NM; 

    LOOP 
     FETCH COLUMN_NM INTO COL; 

     DBMS_OUTPUT.put_line (COL); 

     OPEN DIFFERENCE; 

     LOOP 
     FETCH DIFFERENCE INTO OUTRECORD; 

     INSERT INTO RESULT_MINUS 
       VALUES ('B001', 
         'COMPARE', 
         '2018', 
         COL, 
         OUTRECORD, 
         'NOT PRESENT IN 2017'); 
         COMMIT; 
     END LOOP; 

     CLOSE DIFFERENCE; 
     END LOOP; 

     CLOSE COLUMN_NM; 

    END; 

感謝其他表..

+1

(1)用你正在使用的數據庫標記你的問題。 (2)提供樣本數據和期望的輸出。 (3)提出問題。例如,你現在的代碼有什麼問題? –

+1

爲什麼你在不同的年份有不同的表格? – jarlh

+0

我正在使用oracle數據庫 – mano

回答

0

爲什麼你會在插入不同的內循環使用遊標?只要這樣做:

INSERT INTO RESULT_MINUS (. . .) -- always include the columns 
    SELECT 'B001', 'COMPARE', '2018', 'COL', COL, 'NOT PRESENT IN 2017' 
    FROM (SELECT DISTINCT COL 
      FROM COMPARE_2018_P1 
      MINUS 
      SELECT DISTINCT COL 
      FROM COMPARE_2017_P1 
     ) c; 

至於循環遍歷表中的列,這是一個合理的遊標使用。

您的代碼不起作用,因爲DIFFERENCE遊標需要在內部循環中定義。但它根本不需要。

+0

但我需要比較每列的不同值。所以我想用光標 – mano

+0

@mano。 。 。您可以將光標用於*列*。 *值*不需要光標。 –

+0

但是,當我通過列的差異遊標不工作 – mano

0

如果要使用CURSOR邏輯,則必須動態定義DIFFERNECE遊標(替換列名稱)。

變化

OPEN DIFFERENCE; 

OPEN FOR 
    'SELECT OUTRECORD 
    FROM (SELECT DISTINCT ' || COL || 
      ' FROM COMPARE_2018_P1 
      MINUS 
      SELECT DISTINCT ' || COL || 
      ' FROM COMPARE_2017_P1)'; 

並取出光標的定義。

但是,當然,使用來自其他答案的動態插入的方法由於更好的性能而是可取的。