程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle中用一張表的字段更新另一張表的字段,oracle張表

Oracle中用一張表的字段更新另一張表的字段,oracle張表

編輯:Oracle教程

Oracle中用一張表的字段更新另一張表的字段,oracle張表


今天在做項目的過程中,發現開發庫中某張表的某字段有許多值是空的,而測試庫中該字段的值則是有的。

那麼,有什麼辦法能將測試庫中該字段的值更新到開發庫中呢?

 

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後接一個查詢語句。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved