今天在做項目的過程中,發現開發庫中某張表的某字段有許多值是空的,而測試庫中該字段的值則是有的。
那麼,有什麼辦法能將測試庫中該字段的值更新到開發庫中呢?
SQL Server中這是比較容易解決的,而Oracle中就不知道方法了。
SQL Server中類似問題的解決方法
後來只好用最笨的方法:
首先,將數據復制到Excel;(假設稱測試庫的表為A--含有數據)
然後,在開發庫中建立和表A同結構的表B;(這裡為了導入數據的簡單,我對表B的結構進行了改造,只有兩個字段)
圖 表B的數據
再利用PL SQL的導入功能將這些數據導入到表B中(此時表B的數據為表A的子集);
接下來要做的是將表B的數據更新到開發庫中相應的表中,假設稱之為表D;
這裡用到了oracle中的Merge into。
SQL Code如下:
MERGE INTO D USING B ON (D.CATEGORY_NAME = B.CATEGORY_NAME /*AND B IS NULL*/) WHEN MATCHED THEN UPDATE SET RELAVANCE_PROPETY = B.RELAVANCE_PROPETY
關於MERGE INTO的詳細講解
但是,在此過程中發生了錯誤:
錯誤1:
在執行MERGE INTO操作的時候,發生了ORA-30926錯誤。
該錯誤的原因是什麼?如何解決呢?
原因:
百度了一下,大體知道是因為表B含有重復的Key,這裡的Key就是條件中的CATEGORY_NAME,從條件:
D.CATEGORY_NAME = B.CATEGORY_NAME
可以看出。
補充:
解決:
知道了上面的原因,我們要做的就是把有重復CATEGORY_NAME的記錄刪除。
用下面的SQL獲得哪些CATEGORY_NAME的值重復了:
SELECT CATEGORY_NAME,COUNT(1) FROM B GROUP BY CATEGORY_NAME HAVING COUNT(1) >1
效果如下:
接下來是刪除重復的數據,執行下面語句進入編輯模式:
SELECT * FROM B MM WHERE MM.CATEGORY_NAME IN (SELECT CATEGORY_NAME FROM B GROUP BY CATEGORY_NAME HAVING COUNT(1) >1) FOR UPDATE
效果如下:
然後選擇需要刪除的數據。
我們這邊的表只有2個字段,所以可以用group by結果轉存到臨時表,再用臨時表覆蓋原表的方法洗數據。
但更多的情況是:(1)字段多於兩個;(2)且某個字段相同的記錄,別的字段可能不同(即不完全相同)
錯誤2:
在給B表做備份時,想整表復制到新表中,原來經常使用:
select * into new_table from old_table
去做這樣的事情。預期的結果是:在復制表結構的同時,將表中的數據同時復制到new_table中。
結果,出現了下面的錯誤:
為什麼呢?
原因:
原來select into是PL/SQL的賦值語句!而這裡的使用格式和賦值的格式是不一致的。
所以,會報ORA-00905錯誤。
解決:
那麼,PL/SQL中如何解決類似問題的呢?
那就是用create table,語句如下:
--復制表結構和數據 CREATE TABLE B1 AS SELECT * FROM B;
AS後接一個查詢語句。