SQLServer中刪除重復(fù)數(shù)據(jù)幾個方法IT計算機_第1頁
SQLServer中刪除重復(fù)數(shù)據(jù)幾個方法IT計算機_第2頁
SQLServer中刪除重復(fù)數(shù)據(jù)幾個方法IT計算機_第3頁
SQLServer中刪除重復(fù)數(shù)據(jù)幾個方法IT計算機_第4頁
SQLServer中刪除重復(fù)數(shù)據(jù)幾個方法IT計算機_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1/1SQLServer中刪除重復(fù)數(shù)據(jù)幾個方法-IT計算機

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

利用SQL05特性刪除表中重復(fù)數(shù)據(jù)_SQLServer時間:2023-05-0100:59來源::點擊:93次-

問題:一個表有自增的ID列,表中有一些記錄內(nèi)容重復(fù),也就是說這些記錄除了ID不同之外,其他的信息都相同。...

問題:一個表有自增的ID列,表中有一些記錄內(nèi)容重復(fù),也就是說這些記錄除了ID不同之外,其他的信息都相同。需要把重復(fù)的記錄保留一條,剩下的刪除。

這種需求一般開發(fā)人員都會,我這里寫出兩個版本。

版本一:由于記錄有自增列,所以自增列可以做為記錄的唯一標(biāo)識,由此可見,重復(fù)的記錄的自增ID是一個遞增關(guān)系,這里我們可以只保留ID最小的那條記錄,其它的全部刪除。利用一個嵌套語句就特別簡單寫出下面的SQL。其中的sname,saddress是記錄除了ID外的全部列。

DELETEFROMa

WHEREidNOTIN(SELECTMIN(id)

FROMa

GROUPBYsname,

saddress)

版本二:充分利用SQL05的幾個比較有用的特性。這里先簡潔說說要用到的幾個特性。具體用法可到網(wǎng)上搜尋下。

1:ROW_NUMBER,它的作用就是用來生成行號,默認(rèn)是從1開頭。

2:公用表表達式(CTE),我這里并不會利用它的遞歸,而是用它來簡化嵌套查詢及對表自身引用功能。CTE的語法如下:

[WITHcommon_table_expression[,n]]

common_table_expression::=

expression_name[(column_name[,n])]

AS

(CTE_query_definition)

說明:1CTE在某種程序上相當(dāng)表變量或者臨時表的功能。但比起表變量來說它最大的優(yōu)勢是對自身的引用,CTE語句后面緊跟的select,update,delete等,操作的結(jié)果都會直接反應(yīng)的實際物理表中。相比臨時表,最大優(yōu)勢無非是性能,臨時表實際是一張物理存在的表,在對它進行操作時,會產(chǎn)生額外的IO開銷以及管理上的開銷。

2CTE語法后面需要直接跟上使用CTE的相關(guān)語句select,update,delete等,否則CTE會失效,下面的語句是錯誤的:

代碼

WITHbAS(SELECTROW_NUMBEROVER(PARTITIONBYsname,saddressORDERBYsname,saddress)ASrn,

*

FROMa

)

DELETEFROMb

WHERErn1

SELECT*froma

SELECT*FROMbWHERErn1

3:PARTITIONBY,

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

分區(qū)函數(shù)。和聚合函數(shù)不同的地方在于它能返回一個分組中的多條記錄,聚合函數(shù)一般只有一條反映統(tǒng)計值的記錄,partitionby用于給結(jié)果集分組,假如沒有指定那么它把整個結(jié)果集作為一個分組。

經(jīng)過上面的三個關(guān)鍵字的介紹后,下面給出三者相結(jié)合后的結(jié)果。

代碼

WITHbAS(SELECTROW_NUMBEROVER(PARTITIONBYsname,saddressORDERBYsname,saddress)ASrn,

*

FROMa

)

DELETEFROMb

WHERErn1

版本一和版本二比較:

1:版本二更加簡單閱讀。

2:版本二性能較版本一強。我們可以通過以以信息來看??梢钥吹桨姹疽粫l(fā)生兩次表掃描。

代碼

Table'a'.Scancount2,logicalreads4,physicalreads0,read-aheadreads0,loblogicalreads0,lobphysicalreads0,lobread-aheadreads0.

Table'Worktable'.Scancount1,logicalreads0,physicalreads0,read-aheadreads0,loblogicalreads0,lobphysicalreads0,lobread-aheadreads0.

(0row(s)affected)

Table'a'.Scancount1,logicalreads2,physicalreads0,read-aheadreads0,loblogicalreads0,lobphysicalreads0,lobread-aheadreads0.

(0row(s)affected)(責(zé)任編輯:admin)

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

數(shù)據(jù)庫的使用過程中由于程序方面的問題有時候會遇到重復(fù)數(shù)據(jù),重復(fù)數(shù)據(jù)導(dǎo)致了數(shù)據(jù)庫部分設(shè)置不能正確設(shè)置……

方法一

declare@maxinteger,@idinteger

declarecur_rowscursorlocalforselect主字段,count(*)from表名groupby主字段havingcount(*)1

opencur_rows

fetchcur_rowsinto@id,@max

while@@fetch_status=0

begin

select@max=@max-1

setrowcount@max

deletefrom表名where主字段=@id

fetchcur_rowsinto@id,@max

end

closecur_rows

setrowcount0

方法二

有兩個意義上的重復(fù)記錄,一是完全重復(fù)的記錄,也即全部字段均重復(fù)的記錄,二是部分關(guān)鍵字段重復(fù)的記錄,比如Name字段重復(fù),而其他字段不肯定重復(fù)或都重復(fù)可以忽視。

1、對于第一種重復(fù),比較簡單解決,使用

selectdistinct*fromtableName

就可以得到無重復(fù)記錄的結(jié)果集。

假如該表需要刪除重復(fù)的記錄(重復(fù)記錄保留1

條),可以按以下方法刪除

selectdistinct*into#TmpfromtableName

droptabletableName

select*intotableNamefrom#Tmp

droptable#Tmp

發(fā)生這種重

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

復(fù)的緣由是表設(shè)計不周產(chǎn)生的,增加唯一索引列即可解決。

2、這類重復(fù)問題通常要求保留重復(fù)記錄中的第一條記錄,操作方法如下

假設(shè)有重復(fù)的字段為Name,Address,要求得到這兩個字段唯一的結(jié)果集

selectidentity(int,1,1)asautoID,*into#TmpfromtableName

selectmin(autoID)asautoIDinto#Tmp2from#TmpgroupbyName,autoID

select*from#TmpwhereautoIDin(selectautoIDfrom#tmp2)

最終一個select即得到了Name,Address不重復(fù)的結(jié)果集(但多了一個autoID字段,實際寫時可以寫在select子句中省去此列)

如何禁止遠(yuǎn)程訪問sqlserver

(1)SqlServer服務(wù)使用兩個端口:TCP-1433、UDP-1434。其中1433用于供SqlServer對外供應(yīng)服務(wù),1434用于向懇求者返回SqlServer使用了那(1)SqlServer服務(wù)使用兩個端口:TCP-1433、UDP-1434。其中1433用于供SqlServer對外供應(yīng)服務(wù),1434用于向懇求者返回SqlServer使用了那個TCP/IP端口。

可以使用SQLServer的企業(yè)管理器更改SqlServer的默認(rèn)TCP端口。方法

a、打開企業(yè)管理器,依次選擇左側(cè)工具欄的“MicrosoftSQLServersSQLServer組”,打開“SQL實例”(實際環(huán)境中為要修改的SQLServer名稱)的屬性對話框,“常規(guī)”選項卡的最下方的“網(wǎng)絡(luò)配置(N)”按鈕,就可以打開“SQLServer網(wǎng)絡(luò)使用工具”對話框。

b、在“啟用的協(xié)議”列表里有TCP/IP協(xié)議,在屬性里的默認(rèn)端口選項中輸入要修改的端口號即可修改。還有一項為隱蔽,假如選中則表示著客戶端無法通過枚舉服務(wù)器來看到這臺服務(wù)器,起到愛護的作用,而且不影響連接。

(2)SqlAgent服務(wù)使用TCP-1625、TCP-1640端口供應(yīng)服務(wù)。

(3)SQL查詢分析器,通過1601端口1433,連接SqlServer

如何禁止向數(shù)據(jù)庫中輸入重復(fù)內(nèi)容?新手向你致敬

請教各位老師:

用戶在向數(shù)據(jù)庫中各字段添加信息時候,假如庫中不存在相同信息則可以添加,假如已經(jīng)存在則提示不允許重復(fù),請給出詳細(xì)代碼(sql,vb)教導(dǎo)迷津,跪謝。

在應(yīng)用程序里推斷嘛,插入數(shù)據(jù)之前,推斷一下不就是了!

或者給這些字段加唯一索引,insert重復(fù)的數(shù)據(jù)時就會報錯

rs.openselect*fromtablenamewherefieldname='text1',cn

ifrs.eofthen

msgbox沒有重復(fù)

else

msgbox重復(fù)了。

endif

--創(chuàng)建一個存儲過程

createproc插入

@字段1varchar(10),@字段2varchar(10),@flagchar(1)output

as

ifexists(select1from表wh

ere字段1=@字段1and字段2=@字段2)

begin

set@flag='0'

return

end

else

begin

set@flag='1'

insertinto表(字段1,字段2)se

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

lect@字段1,@字段2

return

end

--然后在前臺調(diào)用該存儲過程,將要插入數(shù)據(jù)庫的字段值分別賦值給兩個輸入?yún)?shù),并返回另外一個輸出參數(shù),假如輸出參數(shù)的值為'0',表示有重復(fù)記錄,插入失敗,否則插入勝利

檢驗輸入數(shù)據(jù)是否重復(fù)函數(shù)(SQLServer)時間:2023-07-1821:26:40來源:網(wǎng)絡(luò):未知點擊:130次//檢驗輸入數(shù)據(jù)是否重復(fù)函數(shù)(SQLServer)

publicboolGetVerifyData(stringMySQL)

{

//數(shù)據(jù)庫SQL語句

stringstrSQL=@MySQL.Trim.ToString;

//數(shù)據(jù)庫連接參數(shù)(對客戶端應(yīng)用程

//檢驗輸入數(shù)據(jù)是否重復(fù)函數(shù)(SQLServer)

publicboolGetVerifyData(stringMySQL)

{

//數(shù)據(jù)庫SQL語句

stringstrSQL=@MySQL.Trim.ToString;

//數(shù)據(jù)庫連接參數(shù)(對客戶端應(yīng)用程序配置文件的訪問)

stringstrConn=@ConfigurationManager.ConnectionStrings[MyConnectionString].ConnectionString;

//創(chuàng)建連接數(shù)據(jù)庫的一個打開連接

SqlConnectionMyConn=newSqlConnection(strConn);

try//正常運行

{

//使用ConnectionString所指定的屬性設(shè)置打開數(shù)據(jù)庫連接

MyConn.Open;

//要對數(shù)據(jù)庫執(zhí)行的一個SQL語句或存儲過程

SqlCommandMyComm=newSqlCommand(strSQL,MyConn);

//供應(yīng)一種從數(shù)據(jù)庫讀取只進的行流的一種方式

SqlDataReaderMyReader=MyComm.ExecuteReader;

//讀取數(shù)據(jù),推斷是否有數(shù)據(jù)

if(MyReader.HasRows)

{

Console.Write(scriptlanguage=JavaScript);

Console.Write(alert('系統(tǒng)提示:您輸入的資料已經(jīng)存在,請核對后重新輸入!'););

Console.Write(/script);

if((MyReader!=null)(MyReader.IsClosed!=true))

{

//關(guān)閉

MyReader.Close;

}

//返回失敗

returnfalse;

}

else

{

if((MyReader!=null)(MyReader.IsClosed!=true))

{

//關(guān)閉

MyReader.Close;

}

//返回勝利

returntrue;

}

}

catch(SqlException)//數(shù)據(jù)庫操作特別處理

{

Console.Write(scriptlanguage=JavaScript);

Console.Write(alert('系統(tǒng)提示:當(dāng)前數(shù)據(jù)庫操作失敗或網(wǎng)絡(luò)忙,請稍后再試!'););

Consol

e.Write(/script);

if(MyConn.State==ConnectionState.Open)

{

//關(guān)閉數(shù)據(jù)庫連接

MyConn.Close;

}

//返回失敗

returnfalse;

}

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

catch//特別處理

{

if(MyConn.State==ConnectionState.Open)

{

//關(guān)閉數(shù)據(jù)庫連接

MyConn.Close;

}

//返回失敗

returnfalse;

}

finally//執(zhí)行完畢清除在try塊中安排的任何資源

{

if(MyConn.State==ConnectionState.Open)

{

//關(guān)閉數(shù)據(jù)庫連接

MyConn.Close;

}

}

}

本篇文章來源于:開發(fā)學(xué)院原文鏈接:/2023/0718/24324.php

在SQLServer中快速刪除重復(fù)記錄

===========================================================

:sqlserver

發(fā)表于:2023.07.1721:53

分類:一般分類

出處:/post/20961/146559

開發(fā)人員的噩夢——刪除重復(fù)記錄

想必每一位開發(fā)人員都有過類似的經(jīng)受,在對數(shù)據(jù)庫進行查詢或統(tǒng)計的時候不時地會遇到由于表中存在重復(fù)的記錄而導(dǎo)致查詢和統(tǒng)計結(jié)果不精確?????。解決該問題的方法就是將這些重復(fù)的記錄刪除,只保留其中的一條。

在SQLServer中除了對擁有十幾條記錄的表進行人工刪除外,實現(xiàn)刪除重復(fù)記錄一般都是寫一段代碼,用游標(biāo)的方法一行一行檢查,刪除重復(fù)的記錄。由于這種方法需要對整個表進行遍歷,所以對于表中的記錄數(shù)不是很大的時候還是可行的,假如一張表的數(shù)據(jù)達到上百萬條,用游標(biāo)的方法來刪除簡直是個噩夢,由于它會執(zhí)行相當(dāng)長的一段時間。

四板斧——輕松消退重復(fù)記錄

殊不知在SQLServer中有一種更為簡潔的方法,它不需要用游標(biāo),只要寫一句簡潔插入語句就能實現(xiàn)刪除重復(fù)記錄的功能。為了能清晰地表述,我們首先假設(shè)存在一個產(chǎn)品信息表Products,其表結(jié)構(gòu)如下:

CREATETABLEProducts(

ProductIDint,

ProductNamenvarchar(40),

Unitchar(2),

UnitPricemoney

)

假設(shè)產(chǎn)品Chang和Tofu的記錄在產(chǎn)品信息表中存在重復(fù)?,F(xiàn)在要刪除這些重復(fù)的記錄,只保留其中的一條。步驟如下:

第一板斧——建立一張具有相同結(jié)構(gòu)的臨時表

CREATETABLEProducts_temp(

ProductIDint,

ProductNamenvarchar(40),

Unitchar(2),

UnitPricemoney

)

其次板斧——為該表加上索引,并使其忽視重復(fù)的值

方法是在企業(yè)管理器中找到上面建立的臨時表Produ

cts_temp,單擊鼠標(biāo)右鍵,選擇全部任務(wù),選擇管理索引,選擇新建。然后設(shè)置索引選項。

第三板斧——拷貝產(chǎn)品信息到臨時表

insertintoProducts_tempSelect*fromProducts

此時SQLServer會返回

SQLServer中刪除重復(fù)數(shù)據(jù)的幾個方法

如下提示:

服務(wù)器:消息3604,級別16,狀態(tài)1,行1

已忽視重復(fù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論