2015-11-04 84 views
0

我有一個表TBL_CLASS與結構從另一列加序列

CLASS_NAME | CLASS_TYPE 
Maths  PRI  
Math   SEC 
English  PRI 
English  PAR 
Physics  PAR 
Biology  BIO 

我想要做的就是更新值數學的ClassCode列,並從0001不是啓動序列重命名與值的列1,以便表上面會成爲

CLASS_NAME | CLASS_TYPE | CLASS_CODE 
Maths  MATH  MATH0001 
Math   MATH  MATH0002 
English  ENG   ENG0001 
English  ENG   ENG0002 
Physics  PHY   PHY0001 
Biology  BIO   BIO0001 

是否有可能這樣做只是在數據庫中不填充MATH0001或ENG0001第一列每列或創建一個臨時列?

我可以創建與序列一個臨時列,但我還是必須填寫第一號入列,然後選擇MAX

SELECT MAX(substr(TEMP_CODE, -4)) AS LAST4DIGIT FROM TBL_CLASS WHERE CLASS_TYPE= 'MATHS' 

,然後更新與更新語句

UPDATE TBL_CLASS SET CLASS_CODE = CLASS_TYPE||TEMP_COL 

我想達成什麼是一個像

UPDATE TBL_CLASS SET CLASS_CODE = CLASS_NAME|| <sequence>聲明更新ClassCode沒有在第一填充值(0001),並將序列添加到臨時列中。

欣賞我如何能處理這個任意球。

回答

0

此SQL顯示瞭如何與列輸出操作。如果這是你想要的,你可以用它來更新你的表格。如果你需要添加一個新的(例如Math)行並且需要找到你可以使用的索引號。 REGEXP_SUBST來提取只有數字,然後刪除前面的零(並添加1)。

SELECT class_name, 
     SUBSTR (UPPER (class_name), 
       1, 
       CASE WHEN UPPER (class_name) LIKE 'MATH%' THEN 4 ELSE 3 END) 
      class_type, 
      SUBSTR (
      UPPER (class_name), 
      1, 
      CASE WHEN UPPER (class_name) LIKE 'MATH%' THEN 4 ELSE 3 END) 
     || LPAD (
      ROW_NUMBER() OVER (PARTITION BY class_type ORDER BY class_type), 
      4, 
      '0') 
      class_code 
    FROM tbl_class 

編輯:我沒有意識到的是,WITH條款可能會造成誤解,所以我已經刪除了它。

+0

它的工作原理,但我仍然需要手工添加語句對所有CLASS_NAME和class_type。 –

+0

有重複的Class_Code,我不得不手動添加選擇CLASS_NAME,class_type因爲我有類百餘。 –

+1

你意識到了'隨着tbl_class如...'部分只是喬恩創建包含的別名是tbl_class一些樣本數據的子查詢,以便在主SQL語句(以'選擇CLASS_NAME,SUBSTR(上(CLASS_NAME) ....'可以在無需創建一個單獨的tbl_class右表中查詢數據?既然你已經有一個名爲tbl_class在它的數據表,你可以只使用主SQL語句。 – Boneist