版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六年級下學(xué)期詞組語法歸納
- 2024-2025學(xué)年版塊16 歐姆定律及電阻定律 專題16-1 歐姆定律??碱}型 (含答案) 初中物理尖子生自主招生培優(yōu)講義83講
- 2025屆吉林省九師聯(lián)盟高三上教學(xué)質(zhì)量監(jiān)測語文試題及答案
- 內(nèi)蒙古通遼市奈曼旗2023-2024學(xué)年中考數(shù)學(xué)考前最后一卷含解析
- 湖北省黃岡市2023-2024學(xué)年高二上學(xué)期期中考試化學(xué)試題
- 小班奇妙的人體課件
- 車載充電機行業(yè)供需現(xiàn)狀與發(fā)展戰(zhàn)略規(guī)劃
- 建設(shè)工程裝潢合同模板
- 塑膠外發(fā)加工合同模板
- 外貿(mào)代付款合同模板
- 鎂合金行業(yè)發(fā)展分析及投資前景預(yù)測報告
- 中國成人局灶性癲癇規(guī)范化診治指南
- 2024年培訓(xùn)主管培訓(xùn)課件EAP(一)-(多場景)
- 基因工程技術(shù)在生物質(zhì)燃料加工中的應(yīng)用
- 液化氣安全使用培訓(xùn)
- 部隊預(yù)防中暑
- 門靜脈血栓護理查房課件
- 《混凝土澆筑》課件
- 搜救犬搜救方案
- 2023-2024學(xué)年福建省福州市八縣市一中高一上學(xué)期期中聯(lián)考試題 生物(解析版)
- 健身理論與指導(dǎo)
評論
0/150
提交評論