標籤:
今天在做項目的過程中,發現開發庫中某張表的某欄位有許多值是空的,而測試庫中該欄位的值則是有的。
那麼,有什麼辦法能將測試庫中該欄位的值更新到開發庫中呢?
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 DUSING BON (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 BGROUP BY CATEGORY_NAMEHAVING COUNT(1) >1
效果如下:
接下來是重複資料刪除的資料,執行下面語句進入編輯模式:
SELECT * FROM B MMWHERE MM.CATEGORY_NAME IN(SELECT CATEGORY_NAME FROM BGROUP BY CATEGORY_NAMEHAVING 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後接一個查詢語句。
Oracle中用一張表的欄位更新另一張表的欄位