知识大全 如何删除数据库中的冗余数据(2)

Posted

篇首语:少年击剑更吹箫,剑气箫心一例消。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何删除数据库中的冗余数据(2)相关的知识,希望对你有一定的参考价值。

  它将冗余数据选择到一个游标中 并根据(LastName FirstName)来分组(在我们这个方案中) 然后打开游标然后循环地取出每一行 然后用与先前的取出的键值进行比较 如果这是第一次取出这个值 或者这个值不是冗余键 那么跳过这个记录然后取下一个 不然的话 这就是这个组中的冗余记录 所以删掉它.

  让我们运行一下这个存储过程

  BEGIN

  DeleteDuplicates;

  END;

  /

  SELECT LastName FirstName COUNT(*)

  FROM Customers

  GROUP BY LastName FirstName

  HAVING COUNT(*) > ;

  最后一个查询语句没有返回值 所以冗余数据没有了从表中取冗余数据的过程完全是由定义在csr_Duplicates 这个游标中的SQL语句来实现的 PL/SQl只是用来实现删除冗余数 那么能不能完全用SQL语句来实现呢?

  二.SQL解决方案 使用RANK()删除冗余数据Oracle i分析函数RANK()来枚举每一个组中的元素 在我们的方案中  我们应用这个方案 我们使用这个函数动态的把冗余数据连续的排列起来加上编号 组由Partintion by 这个语句来分开 然后用Order by 进行分组SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

  FirstName ORDER BY ID) SeqNumber

  FROM Customers

  ORDER BY LastName FirstName;

  SQL

  Listing Output of single SQL statement that uses RANK()

  显示的是根据记录的条数的个数来显示尤其对于冗余数据

  ID LASTNAME FIRSTNAME SEQNUMBER

  

   Blake Becky

   Blue Don

   Bradley Tom

   Chang Jim

   Griffith David

   Hill Larry

   King Chuck

   Krieger Jeff

   Krieger Jeff

   Krieger Jeff

   Loney Julie

   Lord Don

   Mason Paul

   Monroe John

   Simon Michael

   Simon Michael

   Stone Tony

   Stone Tony

   Stone Tony

   Stone Tony

   Stone Tony

  我们可以看一到 SeqNumber这一列中的数值 冗余数据是根据ID号由小到大进行的排序 所有的冗余数据的SqlNumber都大于一 所有的非冗余数据都等于一 所以我们取自己所需 删除那么没用的SELECT ID LastName FirstName

  FROM

  (SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

  FirstName ORDER BY ID) AS SeqNumber

  FROM Customers)

  WHERE SeqNumber > ;

  SQL

  Listing 冗余键的键值

  有七行必须被删除

  ID LASTNAME FIRSTNAME

  

   Krieger Jeff

   Krieger Jeff

   Simon Michael

   Stone Tony

   Stone Tony

   Stone Tony

   Stone Tony

   rows selected 这显示有七行需要删除 还是用上一个表我测试了一下这个代码 它用了77秒种就删除了所有的数据准备好了用Sql语句来删除冗余数据 版本一它执行了 秒

  DELETE

  FROM CUSTOMERS

  WHERE ID IN

  (SELECT ID

  FROM

  (SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

  FirstName ORDER BY ID) AS SeqNumber

  FROM Customers)

  WHERE SeqNumber > );

  我们可以看到最后的两行语句对表中的数据进行了排序 这不是有效的 所以我们来优化一下最后一个查询语句 把Rank()函数应用到只含有冗余数据的组 而不是所有的列下面这个语句是比较有效率的 虽然它不像上一个查询那样精简SELECT ID LastName FirstName

  FROM

  (SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

  FirstName ORDER BY ID) AS SeqNumber

  FROM

  (SELECT ID LastName FirstName

  FROM Customers

  WHERE (LastName FirstName) IN (SELECT LastName FirstName

  FROM Customers

  GROUP BY LastName FirstName

  HAVING COUNT(*) > )))

  WHERE SeqNumber > ;

  选择冗余数据只用了26秒钟 这样就提高了 %的性能 这样就提高了将这个作为子查询的删除查询的效率

  DELETE

  FROM Customers

  WHERE ID IN

  (SELECT ID

  FROM

  (SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

  FirstName ORDER BY ID) AS SeqNumber

  FROM

  (SELECT ID LastName FirstName

  FROM Customers

  WHERE (LastName FirstName) IN (SELECT LastName FirstName

  FROM Customers

  GROUP BY LastName FirstName

  HAVING COUNT(*) > )))

  WHERE SeqNumber > );

  现在只用了 秒钟的就完成的上面的任务 比起上一个 秒 这是一个很大的进步 相比之下 存储过程用了 秒 这样存储过程有些慢了使用PL/SQL语句我们和我们以上的代码 会得到更好的更精确的代码 和提高你代码的执行效率 虽然对于从数据库中枚举数据PL/SQL对于Sql两者没有什么差别 但是对于数据的比较上 PL/SQL就比SQL要快很多 但是如果冗余数据量比较小的话 我们尽量使用SQL而不使用PL/SQL如果你的数据表没有主键的话 那么你可以参考其它技术

  Rank()其它的方法

  使用Rank()函数你可以对选择你所保留的数据 (或者是小ID的或者是大ID 的 就由RECDate这个列来决定这种情况下 你可以把REcdate加入到(Orderby )子句中 倒序或者正序

  这是一种保留最大Id的一种解决方案

  DELETE

  FROM Customers

  WHERE ID IN

  (SELECT ID

  FROM

  (SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName FirstName ORDER BY RecDate DESC ID) AS SeqNumber

  FROM

  (SELECT ID LastName FirstName RecDate

  FROM Customers

  WHERE (LastName FirstName) IN (SELECT LastName FirstName

  FROM Customers

  GROUP BY LastName FirstName

  HAVING COUNT(*) > )))

  WHERE SeqNumber > );

  这种技术保证了你可以控制每一个表中的保留的组 假设你有一个数据库 有一个促销或者有一个折扣信息 比如一个团体可以使用这种促销5次 或者个人可以使用这个折扣三次 为了指出要保留的组的个数 你可以在where 和having子句中进行设置 那么你将删除所有大于你

  设置有数的冗余组

  DELETE

  FROM Customers

  WHERE ID IN

  (SELECT ID

  FROM

  (SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

  FirstName ORDER BY ID) AS SeqNumber

  FROM

  (SELECT ID LastName FirstName

  FROM Customers

  WHERE (LastName FirstName) IN (SELECT LastName FirstName

  FROM Customers

  GROUP BY LastName FirstName

  HAVING COUNT(*) > )))

  WHERE SeqNumber > );

  As you can see using the RANK() function allows you to eliminate duplicates in a

  single SQL statement and gives you more capabilities by extending the power of

  your

  queries

cha138/Article/program/Oracle/201311/18979

相关参考

知识大全 如何删除excel表中的重复数据

如何删除excel表中的重复数据?要具体的数据---筛选---高级筛选----列表区域(选择你要选择的区域)----复制到(选择你要选择的区域)---勾画下面【选择不重复记录】----确定在ORACL

知识大全 如何快速删除Excel表格中的重复数据

如何快速删除Excel表格中的重复数据  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!如何快速删除Ex

知识大全 删除数据-DELETE语句(2)

SQL实战新手入门:删除数据-DELETE语句(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 数据结构 4.9 链队列中删除元素

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  删除当前队列Q中的头元素cha138/Article/progra

知识大全 数据库开发规范详细介绍[1]

  一.数据表和字段的设计  表设计原则  标准化和规范化  数据的标准化有助于消除数据库中的数据冗余标准化有好几种形式我们在这里采用ThirdNormalForm(NF)因为NF在性能扩展性和数据完

知识大全 数据结构 2.4 顺序表中删除元素操作

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  删除元素使线性表的逻辑结构发生什么变化?  假设删除线性表中第i个元素使得线

知识大全 数据结构 2.8 顺序表中删除元素示例算法(一)

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  编写算法删除顺序表中多余的数据元素即使操作之后的顺序表中所有元素的值都不相同

知识大全 数据结构 2.9 顺序表中删除元素示例算法(二)

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  编写算法删除顺序表中多余的数据元素即使操作之后的顺序表中所有元素的值都不相同

知识大全 数据结构 2.5 删除元素操作示例算法

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  boolListDelete(SqList&LintposElemT

知识大全 数据结构 3.1.2 单链表中删除元素操作

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  和插入类似由于删除元素ai改变了元素之间的关系使ai+不再是ai的后继而是a