delete 重复行;delete join ;update join
delete dbo.GI_Rep_Qty_Emp_Combine from dbo.GI_Rep_Qty_Emp_Combineleftjoin dbo.qGI_INP_EMP_CCSDON dbo.qGI_INP_EMP_CCSD.Employee=dbo.GI_Rep_Qty_Emp_Combine.Employeewhere GI_Rep_Qty_Emp_Combine.LedgerYear='2010'and GI_Rep_Qty_Emp_Combine.Quarter='1'andisnull(qGI_INP_EMP_CCSD.Employee,'')<>''
这两句相同,去掉了Inner join
DELETE FROM dbo.GI_Rep_Qty_Emp_Combine
WHERE(Employee IN(SELECT EmployeeFROM dbo.qGI_INP_EMP_CCSD)) AND(LedgerYear ='2012')AND(Quarter='1')
一、原来只知道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
Deletefrom 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
whereconvert(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
droptable #temp1