Sql語句問題 刪除相同數據 ( 积分: 50 )

  • 主题发起人 主题发起人 rdy808
  • 开始时间 开始时间
R

rdy808

Unregistered / Unconfirmed
GUEST, unregistred user!
在表中有多條數據完全一樣,唯一可以做標示的字段為ID .現在需要所有相同數據只留一條,刪除其他重復的,這樣的語句怎麽寫!
 
删除除主键外其他字段都重复的记录<br><br>Table:&nbsp;TABLENAME<br>Filed:&nbsp;ID(主键),Filed1<br><br>DELETE&nbsp;TABLENAME&nbsp;From&nbsp;TABLENAME&nbsp;Left&nbsp;Join&nbsp;(Select&nbsp;Min(ID)&nbsp;as&nbsp;ID,&nbsp;Filed1&nbsp;From&nbsp;TABLENAME&nbsp;Group&nbsp;By&nbsp;Filed1)&nbsp;as&nbsp;T&nbsp;On&nbsp;(TABLENAME.ID&nbsp;=&nbsp;T.ID)&nbsp;Where&nbsp;T.ID&nbsp;Is&nbsp;Null<br><br>查询重复的数据记录<br>Select&nbsp;ID,Filed1&nbsp;from&nbsp;TABLENAME&nbsp;group&nbsp;by&nbsp;Filed1&nbsp;having&nbsp;count(Filed1)&nbsp;&gt;&nbsp;1&nbsp;;
 
其實這個不難的,如果是完全一樣沒有可以做標示的話就弄一個臨時表,先用distinct插入到臨時表中,然后再刪除后再把數據從臨時表中弄過來就行啦,如果是有ID做標識的話,你先按照表中的除ID外的所有字段進行匯總,抓取ID號最大或是最小的,然后刪除ID號不等於你取得ID號的記錄不就行啦
 
二樓的好像是可行的!<br>三樓的兄弟,你說的那種方法好像是不行的,如果改動下條件,改爲用一個日期來區分相同數據行,好像就不行了,而且這個方法好像比較複雜!!<br>二樓的方法我正在試,但是原理還沒弄清楚!!
 
当然是可以的,哈哈!!!!不行来找我!!!<br>三楼说的也没错,不过繁体字看的头晕!
 
angellover&nbsp;如果我把不那个id&nbsp;改成&nbsp;日期&nbsp;&nbsp;,唯一不同的是日期,你的那个好像真的不行啊&nbsp;!!!!<br>我用的是&nbsp;&nbsp;Oracle&nbsp;试验的!!<br>select&nbsp;*&nbsp;from&nbsp;pmm_proj_ctl_etaetdcfm&nbsp;p&nbsp;<br>left&nbsp;join&nbsp;(select&nbsp;max(createdate)&nbsp;createdate&nbsp;,&nbsp;sampleid&nbsp;from&nbsp;pmm_proj_ctl_etaetdcfm&nbsp;&nbsp;group&nbsp;by&nbsp;sampleid&nbsp;)&nbsp;e&nbsp;<br>on&nbsp;p.createdate&nbsp;=&nbsp;e.createdate<br>你看我这句是不是你的方法!
 
大家一起来研究下阿
 
删除除主键外其他字段都重复的记录<br><br>Table:&nbsp;TABLENAME<br>Filed:&nbsp;ID(主键),Filed1<br><br>DELETE&nbsp;TABLENAME&nbsp;From&nbsp;TABLENAME&nbsp;Left&nbsp;Join&nbsp;(Select&nbsp;Min(ID)&nbsp;as&nbsp;ID,&nbsp;Filed1&nbsp;From&nbsp;TABLENAME&nbsp;Group&nbsp;By&nbsp;Filed1)&nbsp;as&nbsp;T&nbsp;On&nbsp;(TABLENAME.ID&nbsp;=&nbsp;T.ID)&nbsp;Where&nbsp;T.ID&nbsp;Is&nbsp;Null<br>//没问题啊<br><br>查询重复的数据记录<br>Select&nbsp;Filed1&nbsp;from&nbsp;TABLENAME&nbsp;group&nbsp;by&nbsp;Filed1&nbsp;having&nbsp;count(Filed1)&nbsp;&gt;&nbsp;1&nbsp;;&nbsp;&nbsp;//ID要去掉
 
测试环境:SQL&nbsp;SERVER&nbsp;2000<br>数据:<br>id(datetime)&nbsp;&nbsp;filed1(nvarchar)<br>2007-6-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa<br>2007-6-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb<br>2007-6-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc<br>2007-6-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb<br>2007-6-5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc<br>测试语句:<br>select&nbsp;*&nbsp;from&nbsp;table1;<br>select&nbsp;filed1&nbsp;from&nbsp;table1&nbsp;group&nbsp;by&nbsp;filed1&nbsp;having&nbsp;count(filed1)&gt;1;<br><br>DELETE&nbsp;table1&nbsp;From&nbsp;table1&nbsp;Left&nbsp;Join&nbsp;(Select&nbsp;Min(ID)&nbsp;as&nbsp;ID,&nbsp;Filed1&nbsp;From&nbsp;table1&nbsp;Group&nbsp;By&nbsp;Filed1)&nbsp;as&nbsp;T&nbsp;On&nbsp;(table1.ID&nbsp;=&nbsp;T.ID)&nbsp;Where&nbsp;T.ID&nbsp;Is&nbsp;Null<br>结果:<br>id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filed1<br>2007-6-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa<br>2007-6-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb<br>2007-6-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc
 
为什么后面加了&nbsp;&nbsp;where&nbsp;T.ID&nbsp;is&nbsp;Null&nbsp;???<br>麻烦帮我解释下!!
 
select&nbsp;*&nbsp;From&nbsp;table1&nbsp;Left&nbsp;Join&nbsp;(Select&nbsp;Min(ID)&nbsp;as&nbsp;ID,&nbsp;Filed1&nbsp;From&nbsp;table1&nbsp;Group&nbsp;By&nbsp;Filed1)&nbsp;as&nbsp;T&nbsp;On&nbsp;(table1.ID&nbsp;=&nbsp;T.ID)&nbsp;<br>--Where&nbsp;T.ID&nbsp;Is&nbsp;Null<br>什么结果?
 
这里其实也是用临时表T,来实现了
 
Select&nbsp;Min(ID)&nbsp;as&nbsp;ID,&nbsp;Filed1&nbsp;From&nbsp;table1&nbsp;Group&nbsp;By&nbsp;Filed1<br>这个是T表<br>你看看它的内容,然后比较一下,就知道了
 
在说LEFT&nbsp;JOIN的用法:<br>取table1的所有记录+T表的相同记录,其它都是NULL<br>即:<br>id(datetime)&nbsp;&nbsp;filed1(nvarchar)id(datetime)&nbsp;&nbsp;filed1(nvarchar)<br>2007-6-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-6-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa<br>2007-6-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-6-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb<br>2007-6-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-6-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc<br>2007-6-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br>2007-6-5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br>2007-6-6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-6-6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dd
 
这样结果要找的数据就是:<br>2007-6-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br>2007-6-5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL
 
你的方法我正在消化,谢谢!<br>SELECT&nbsp;*&nbsp;FROM&nbsp;t_dup&nbsp;a&nbsp;WHERE&nbsp;a.ROWID&nbsp;&lt;&gt;&nbsp;(SELECT&nbsp;MIN(b.ROWID)&nbsp;FROM&nbsp;t_dup&nbsp;b&nbsp;WHERE&nbsp;a.code=b.code)<br>我这个是另一种方法,不太懂这种连接,你能帮我解释下吗?
 
上面的SQL语句结果好像没记录!
 
解释就是:前面查询&lt;&gt;&nbsp;(not&nbsp;exists)后面表的内容
 
有碰过这个问题,有想过解决的方法,一直没心情坐下来写,现在有空研究一下:<br><br>delete&nbsp;from&nbsp;table1<br>where&nbsp;field1&nbsp;in&nbsp;(select&nbsp;field1&nbsp;from&nbsp;table1&nbsp;group&nbsp;by&nbsp;field1&nbsp;having&nbsp;count(*)&gt;1)<br>and&nbsp;field2&nbsp;in&nbsp;(select&nbsp;field2&nbsp;from&nbsp;table1&nbsp;group&nbsp;by&nbsp;field2&nbsp;having&nbsp;count(*)&gt;1)<br>....//可以判断重复的字段尽可能写多1、2个...<br>and&nbsp;id&nbsp;not&nbsp;in&nbsp;<br>(select&nbsp;id1&nbsp;as&nbsp;id&nbsp;from<br>(select&nbsp;min(id)&nbsp;as&nbsp;id1,field1,field2,....&nbsp;&nbsp;from&nbsp;table1&nbsp;group&nbsp;by&nbsp;field1,field2,....&nbsp;havinf&nbsp;count(*)&gt;1)<br>)<br><br>帮忙调试一下,发表一下意见!谢谢
 
后退
顶部