1. 程式人生 > 實用技巧 >oracle多表關聯刪除的兩種方法

oracle多表關聯刪除的兩種方法

修改了上次的文章,網上的朋友對這篇博文提了意見,非常中肯,雖然上次是轉載,但是我也為我的不專業表示歉意。
這次是原創,所有內容均已經重寫,並驗證通過。

先刪除兩個測試表,p_DropTable是一個判斷表是否存在的儲存過程,如果存在則刪除,不存在則跳過。
CALL p_DropTable('T_DB');
CALL p_DropTable('T_DESC');

-- 建立T_DB表,儲存資料庫名稱及所屬公司資訊
CREATE TABLE T_DB AS
SELECT FID,FPNAME,FCO FROM
(
  SELECT  0 FID,'' FPNAME,'' FCO                     FROM
DUAL UNION ALL SELECT 1,'ORACLE', 'ORACLE' FROM DUAL UNION ALL SELECT 2,'MySQL', 'ORACLE' FROM DUAL UNION ALL SELECT 3,'PostgreSQL', 'UC Berkeley' FROM DUAL UNION ALL SELECT 4,'SQL SERVER', 'Microsoft' FROM DUAL UNION
ALL SELECT 5,'MongoDB', 'MongoDB' FROM DUAL UNION ALL SELECT 6,'Redis', 'Redis' FROM DUAL UNION ALL SELECT 7,'Elasticsearch','Elasticsearch' FROM DUAL UNION ALL SELECT 8,'Neo4j', 'Neo4j' FROM DUAL UNION ALL SELECT
9,'Cassandra', 'Cassandra' FROM DUAL UNION ALL SELECT 10,'SQLite', 'D. Richard Hipp' FROM DUAL UNION ALL SELECT 11,'OceanBase', 'OceanBase' FROM DUAL UNION ALL SELECT 12,'DB2', 'IBM' FROM DUAL UNION ALL SELECT 13,'SYBASE', 'SYBASE' FROM DUAL UNION ALL SELECT 14,'Informix', 'IBM' FROM DUAL UNION ALL SELECT 15,'ACCESS', 'Microsoft' FROM DUAL UNION ALL SELECT 16,'FoxPro', 'Microsoft' FROM DUAL ); -- 建立T_DESC表,儲存資料庫的描述內容 CREATE TABLE T_DESC AS SELECT FID,FDESC FROM ( SELECT 0 FID,'' FDESC FROM DUAL UNION ALL SELECT 1,'佔有率最高的資料庫' FROM DUAL UNION ALL SELECT 2,'最流行的開源資料庫' FROM DUAL UNION ALL SELECT 3,'功能最強大的開源資料庫' FROM DUAL UNION ALL SELECT 4,'Windows上最好的資料庫' FROM DUAL UNION ALL SELECT 5,'最好的基於分散式檔案儲存的文件型資料庫' FROM DUAL UNION ALL SELECT 6,'最好的開源的快取資料庫' FROM DUAL UNION ALL SELECT 7,'最好的搜尋服務' FROM DUAL UNION ALL SELECT 8,'最好的圖資料庫' FROM DUAL UNION ALL SELECT 9,'最好的列式資料庫' FROM DUAL UNION ALL SELECT 10,'最流行的開源的嵌入式資料庫' FROM DUAL UNION ALL SELECT 11,'最有潛力的支援海量資料的高效能分散式關係型資料庫' FROM DUAL UNION ALL SELECT 12,'主要應用於大型應用系統' FROM DUAL UNION ALL SELECT 13,'它是基於客戶伺服器體系結構的資料庫' FROM DUAL UNION ALL SELECT 14,'IBM線上事務處理OLTP旗艦級資料服務系統' FROM DUAL UNION ALL SELECT 15,'基於OFFICE的小型資料庫' FROM DUAL UNION ALL SELECT 16,'基於xBase類的語言的小型資料庫' FROM DUAL ); SELECT * FROM T_DB; SELECT * FROM T_DESC; 希望通過多表關聯的方法,刪除FID=0的記錄, 方法一: 為了防止操作錯誤,先查詢要刪除的資料 SELECT * FROM T_DB WHERE EXISTS ( SELECT 1 FROM T_DESC WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0 ); 使用EXISTS的方法刪除:這裡沒有commit,防止刪除後不能恢復。 DELETE FROM T_DB WHERE EXISTS ( SELECT 1 FROM T_DESC WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0 ); 方法二:使用隱藏表的方法刪除 這種方法只適合兩個表都有主鍵或外來鍵的時候,若是關聯一個管道函式就無法刪除成功,會提示錯誤 所以,首先建立表的關鍵字 Alter Table T_DB Add Constraint T_DBKey Primary Key (FID) Using index; Alter Table T_DESC Add Constraint T_DESCKey Primary Key (FID) Using index; 為了防止操作錯誤,先查詢要刪除的資料 SELECT * FROM ( SELECT T_DB.* FROM T_DB,T_DESC WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0 ); DELETE FROM ( SELECT T_DB.* FROM T_DB,T_DESC WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0 );