oracle多表关联删除的两种方法

本文为原创,深入探讨了Oracle数据库中进行多表关联删除的两种有效方法,已通过实际操作验证,确保内容准确无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修改了上次的文章,网上的朋友对这篇博文提了意见,非常中肯,虽然上次是转载,但是我也为我的不专业表示歉意。
这次是原创,所有内容均已经重写,并验证通过。


先删除两个测试表,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
);

### Oracle关联更新 `UPDATE` 语法示例 在 Oracle 数据库中,可以通过种方式实现基于两关联的更新操作。以下是几种常见的方法及其具体语法: #### 方法一:使用子查询的方式 这种方法通过在 `SET` 子句中嵌套子查询来完成更新操作。需要注意的是,在子查询中可以利用另一张的数据作为更新依据。 ```sql UPDATE table_a A SET A.column_to_update = ( SELECT B.update_value_column FROM table_b B WHERE A.join_key = B.join_key ) WHERE EXISTS ( SELECT 1 FROM table_b B WHERE A.join_key = B.join_key ); ``` 此方法适用于目标列仅需从单个匹配记录获取值的情况[^2]。 --- #### 方法二:使用 `MERGE` 语句 `MERGE` 是 Oracle 提供的一种高效机制,用于在同一 SQL 语句中处理插入和更新逻辑。对于只涉及更新的操作,也可以简化为以下形式: ```sql MERGE INTO table_a A USING table_b B ON (A.join_key = B.join_key) WHEN MATCHED THEN UPDATE SET A.column_to_update = B.update_value_column; ``` 该方法的优势在于其清晰性和性能优化能力,尤其适合大规模数据集的批量更新场景[^1]。 --- #### 方法三:创建临时视图并更新 如果业务逻辑较为复杂或者需要次重复调用相同的联接条件,则可先定义一个视图再对其进行修改。不过这种方式要求被更改的目标字段所属格必须显式指定于最终的 `WHERE` 条件之中以防误改其他无关行项。 ```sql CREATE OR REPLACE VIEW temp_view AS SELECT A.*, B.update_value_column FROM table_a A JOIN table_b B ON A.join_key = B.join_key; -- 执行实际更新动作前记得删除原有视图对象以免冲突 DROP TABLE IF EXISTS updated_table CASCADE CONSTRAINTS; INSERT INTO updated_table(column_list,...) SELECT column_list,... FROM temp_view V; COMMIT; ``` 尽管如此,通常建议直接采用前述两种更为简洁明了的形式除非特殊需求确实存在必要性去构建额外层次结构[^3]。 --- ### 注意事项 - 当运用上述任意一种技术手段实施跨个关系型实体间同步调整数值时,请务必确认源端所提供参照信息具备唯一性特征以避免意外覆盖合法现有条目。 - 如果涉及到远程数据库链接情况下的联合运算符应用实例,请参阅关于如何配置外部连接字符串的相关指导文档[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彖爻之辞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值