ITPub博客

首页 > Linux操作系统 > Linux操作系统 > update,delete与INNER JOIN 以及删除重复数据

update,delete与INNER JOIN 以及删除重复数据

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-10-22 16:14:35 0 删除 编辑
最近又有新东东上来啦,哈哈!虽然都是些遇到的一些小问题,不过我觉得还是应该记录在此,以备不时之需,呵~~~~

一、原来只知道update是可以有inner join ,前几天搞到一个相关东西的时候才知道原来delete也是有inner join .现将两种相关的语法陈列如下,有需要的朋友可以瞄瞄,~~~~~

SQL:

UPDATE

update a

set a.employeestrid=b.pressworkid

from cemployee a inner join ccard b on a.cardid=b.cardid  --其实这个大多都知道的,呵~在这里啰嗦了点,嘻嘻~~~

DELETE

    Delete from econsumedata from econsumedata inner join ccard on econsumedata.cardid=ccard.cardid

 

我们再讲一下删除重复数据的事情,呵~~~其实删除重复数据我一般就使用两种模式。

1、   要最简单,就是先把不重复的查询出来,将不重复的数据先存到临时表里,再将正式表的数据全部删除掉,再使用select insert进行数据的插入,当然这咱情况只适用于数据可以停止下来。

2、   我们经常使用的数据库可能需要你长时间的都在运营,所以前面那种方法就不再可行了,那就需要你直接运行SQL语句,对实际情况进行分析后进行删除,一般我们遇到的重复数据都是大多栏位一样,总会有一个栏们不一样这样的重复数据,请找到这个不一样的栏位,作为一个标志物,再进行利用完成删除重复数据的工作。

E.G.

select deviceid,recordid,cardid,cardvalue,usecount,consumemoney,count(cardid) as card,max(consumedate) as data into #temp1 from econsumedata

where convert(char(10),consumedate,21) between '2006-01-01' and '2007-12-31'

group by deviceid,recordid,cardid,cardvalue,usecount,consumemoney

having count(cardid)>1

order by cardid,usecount        --将相应的不重复的数据查询出来,这里因为其标志本栏位是时间,所以我取了这些重复数据中拥有最大时间的一笔作为正确的数据查询出来放到临时表。

go

delete A from econsumedata A

inner join #temp1 B on A.deviceid=B.deviceid and A.recordid=B.recordid

and A.cardid=B.cardid and A.cardvalue=B.cardvalue and A.usecount=B.usecount

and A.consumemoney=B.consumemoney and A.consumedate<>B.data

--(最后的此条件,如若改成=则表示的是留下来的是这个临时表的那一笔数据,可实现巧妙转换)

--利用临时表进行以前我们前面所讲到的delete inner join (删除时利用表间关联)来完成删除重复数据的功能.

go

drop table #temp1


原文地址: http://www.cnblogs.com/medci/archive/2009/10/19/1586115.html


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-617201/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5297446