zoukankan      html  css  js  c++  java
  • 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
    );
  • 相关阅读:
    yum、RPM常用的命令(转)
    10个你可能从未用过的PHP函数(转)
    sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)
    MySQL查询in操作 查询结果按in集合顺序显示(转)
    sphinx配置文件继承
    开源搜索引擎Sphinx 中启动多个搜索进程的方法(转)
    sphinx的简单实例
    Python中的join()函数的用法
    django queryset values&values_list
    Django中的QuerySet查询优化之select_related
  • 原文地址:https://www.cnblogs.com/jijm123/p/14088985.html
Copyright © 2011-2022 走看看