最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL對(duì)冗余數(shù)據(jù)的刪除重復(fù)記錄只保留單條的說(shuō)明

 更新時(shí)間:2010年03月30日 15:28:53   作者:  
本文講一下數(shù)據(jù)庫(kù)中通常存在一些冗余數(shù)據(jù),如重復(fù)記錄就是一種,那這樣的記錄如何刪除呢?
我們先看一下相關(guān)數(shù)據(jù)結(jié)構(gòu)的知識(shí)。

在學(xué)習(xí)線性表的時(shí)候,曾有這樣一個(gè)例題。

已知一個(gè)存儲(chǔ)整數(shù)的順序表La,試構(gòu)造順序表Lb,要求順序表Lb中只包含順序表La中所有值不相同的數(shù)據(jù)元素。
算法思路:
先把順序表La的第一個(gè)元素付給順序表Lb,然后從順序表La的第2個(gè)元素起,每一個(gè)元素與順序表Lb中的每一個(gè)元素進(jìn)行比較,如果不相同,則把該元素附加到順序表Lb的末尾。
復(fù)制代碼 代碼如下:

public SeqList<int> Purge(SeqList<int> La)
{
SeqList<int> Lb = new SeqList<int>(La.Maxsize);
//將a表中的第1個(gè)數(shù)據(jù)元素賦給b表
Lb.Append(La[0]);
//依次處理a表中的數(shù)據(jù)元素
for (int i = 1; i <= La.GetLength() - 1; ++i)
{
int j = 0;
//查看b表中有無(wú)與a表中相同的數(shù)據(jù)元素
for (j = 0; j <= Lb.GetLength() - 1; ++j)
{
//有相同的數(shù)據(jù)元素
if (La[i].CompareTo(Lb[j]) == 0)
{
break;
}
}
//沒(méi)有相同的數(shù)據(jù)元素,將a表中的數(shù)據(jù)元素附加到b表的末尾。
if (j > Lb.GetLength() - 1)
{
Lb.Append(La[i]);
}
return Lb;
}
}

如果理解了這個(gè)思路,那么數(shù)據(jù)庫(kù)中的處理就好辦了。

我們可以做一個(gè)臨時(shí)表來(lái)解決問(wèn)題
復(fù)制代碼 代碼如下:

select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp

發(fā)生這種重復(fù)的原因是表設(shè)計(jì)不周產(chǎn)生的,增加唯一索引列即可解決。

但是你說(shuō)了,我不想增加任何字段,但這時(shí)候又沒(méi)有顯式的標(biāo)識(shí)列,怎么取出標(biāo)識(shí)列呢?(可以是序號(hào)列,GUID,等)

上個(gè)問(wèn)題先不講,先看看這個(gè)問(wèn)題。

我們分別在三種數(shù)據(jù)庫(kù)中看一下處理辦法,就是通常我們用的Sqlserver2000,Sqlserver2005,Oracle 10g.

1. SQL Server 2000 構(gòu)造序號(hào)列

方法一:
SELECT 序號(hào)=
(SELECT COUNT(客戶編號(hào)) FROM 客戶 AS a WHERE a.客戶編號(hào)<= b.客戶編號(hào)),
客戶編號(hào),公司名稱 FROM 客戶 AS b ORDER BY 1;
方法二:

SELECT 序號(hào)= COUNT(*),
a.客戶編號(hào), a.公司名稱FROM 客戶 AS a, 客戶 AS b
WHERE a.客戶編號(hào)>= b.客戶編號(hào) GROUP BY a.客戶編號(hào), b.公司名稱 ORDER BY 序號(hào);
2. SQL Server 2005 構(gòu)造序號(hào)列

方法一:
SELECT RANK() OVER (ORDER BY 客戶編號(hào) DESC) AS 序號(hào), 客戶編號(hào),公司名稱 FROM 客戶;

方法二:
WITH TABLE AS
(SELECT ROW_NUMBER() OVER (ORDER BY 客戶編號(hào) DESC) AS 序號(hào), 客戶編號(hào),公司名稱 FROM 客戶)
SELECT * FROM TABLE
WHERE 序號(hào) BETWEEN 1 AND 3;
3. Oracle 里 rowid 也可看做默認(rèn)標(biāo)識(shí)列
在Oracle中,每一條記錄都有一個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫(kù)中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個(gè)數(shù)據(jù)文件、塊、行上。
在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中那些具有最大rowid的就可以了,其余全部刪除。
復(fù)制代碼 代碼如下:

select * from test;select * from test group by id having count(*)>1select * from test group by idselect distinct * from testdelete from test a where a.rowid!=(select max(rowid) from test b where a.id=b.id);扯遠(yuǎn)了,回到原來(lái)的問(wèn)題,除了采用數(shù)據(jù)結(jié)構(gòu)的思想來(lái)處理,因?yàn)閿?shù)據(jù)庫(kù)特有的事務(wù)處理,能夠把數(shù)據(jù)緩存在線程池里,這樣也相當(dāng)于臨時(shí)表的功能,所以,我們還可以用游標(biāo)來(lái)解決刪除重復(fù)記錄的問(wèn)題。
declare @max int,
@id int
declare cur_rows cursor local for select id ,count(*) from test group by id having count(*) > 1
open cur_rows
fetch cur_rows into @id ,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max --讓這個(gè)時(shí)候的行數(shù)等于少了一行的統(tǒng)計(jì)數(shù),想想看,為什么
delete from test where id = @id
fetch cur_rows into @id ,@max
end
close cur_rows
set rowcount 0 以上是閃電查閱一些資料寫出的想法,有考慮不周的地方,歡迎大家指出。

相關(guān)文章

  • CentOS 7.3上SQL Server vNext CTP 1.2安裝教程

    CentOS 7.3上SQL Server vNext CTP 1.2安裝教程

    這篇文章主要為大家詳細(xì)介紹了CentOS 7.3上SQL Server vNext CTP 1.2安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • SQL Server 批量插入數(shù)據(jù)的完美解決方案

    SQL Server 批量插入數(shù)據(jù)的完美解決方案

    這篇文章主要介紹了SQL Server 批量插入數(shù)據(jù)的完美解決方案,需要的朋友可以參考下
    2020-12-12
  • SQL中查找某幾個(gè)字段完全一樣的數(shù)據(jù)

    SQL中查找某幾個(gè)字段完全一樣的數(shù)據(jù)

    本文分享SQL語(yǔ)句實(shí)現(xiàn)表中字段的組合累加排序的實(shí)例代碼,希望能給大家做一個(gè)參考。
    2016-06-06
  • sql server安裝及使用全流程(圖文詳解)

    sql server安裝及使用全流程(圖文詳解)

    這篇文章主要介紹了sql server安裝及使用全流程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 通過(guò)navicat連接SQL?Server數(shù)據(jù)庫(kù)的詳細(xì)步驟

    通過(guò)navicat連接SQL?Server數(shù)據(jù)庫(kù)的詳細(xì)步驟

    本文介紹如何通過(guò)navicat連接SQL?Server數(shù)據(jù)庫(kù),以往總是使SQL?Server客戶端來(lái)連接SQL?Server數(shù)據(jù)庫(kù),但是SQL?Server客戶端一般有幾百M(fèi)的大小,而且安裝繁瑣配置麻煩,如果可以通過(guò)Navicat直接連接SQL?Server則會(huì)非常輕松方便,需要的朋友可以參考下
    2023-12-12
  • SQL數(shù)據(jù)查詢之DQL語(yǔ)言介紹

    SQL數(shù)據(jù)查詢之DQL語(yǔ)言介紹

    首先對(duì)于數(shù)據(jù)庫(kù)有一定的了解,會(huì)對(duì)于數(shù)據(jù)庫(kù)的學(xué)習(xí)有一定的幫助;?數(shù)據(jù)庫(kù)主要分為 DB(數(shù)據(jù)庫(kù)),DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng)),SQL(結(jié)構(gòu)化查詢語(yǔ)言,用于和DBMS通信的語(yǔ)言);這篇要講的DQL(數(shù)據(jù)查詢語(yǔ)句)是屬于SQL語(yǔ)言中的一種語(yǔ)言,因此是必學(xué)的語(yǔ)言,希望可以有一定的幫助
    2022-08-08
  • SqlServer公用表表達(dá)式(CTE)的具體使用

    SqlServer公用表表達(dá)式(CTE)的具體使用

    CTE是一種臨時(shí)命名的結(jié)果集,,它在執(zhí)行查詢時(shí)存在,并且只在該查詢執(zhí)行期間有效,本文主要介紹了SqlServer公用表表達(dá)式的具體使用,感興趣的可以了解一下
    2024-08-08
  • 詳解SQL Server的聚焦過(guò)濾索引

    詳解SQL Server的聚焦過(guò)濾索引

    本文主要講解了通過(guò)過(guò)濾索引來(lái)提高查詢性能,同時(shí)也給出了其不同的場(chǎng)景以及其使用優(yōu)點(diǎn)和明顯的缺點(diǎn)。簡(jiǎn)短的內(nèi)容,深入的理解,有興趣的朋友可以看下
    2016-12-12
  • SQL?Server事務(wù)日志文件過(guò)大(已滿)的解決方案

    SQL?Server事務(wù)日志文件過(guò)大(已滿)的解決方案

    隨著數(shù)據(jù)庫(kù)使用時(shí)間增長(zhǎng),日志文件也在不停的增大,這篇文章主要給大家介紹了關(guān)于SQL?Server事務(wù)日志文件過(guò)大(已滿)的解決方案,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 只有mdf文件的數(shù)據(jù)庫(kù)附加失敗的修復(fù)方法分享(置疑、只讀)

    只有mdf文件的數(shù)據(jù)庫(kù)附加失敗的修復(fù)方法分享(置疑、只讀)

    有時(shí)候因?yàn)槟承┰驍?shù)據(jù)庫(kù)只有mdf文件了,需要附加數(shù)據(jù)庫(kù),會(huì)出現(xiàn)一些問(wèn)題,大家可以參考下面的方法試試
    2012-02-02

最新評(píng)論

嘉禾县| 会理县| 揭阳市| 波密县| 穆棱市| 卢龙县| 延庆县| 白玉县| 南华县| 曲水县| 北碚区| 邵东县| 沈阳市| 铜川市| 南江县| 英德市| 延寿县| 江孜县| 休宁县| 镇沅| 乐业县| 鄱阳县| 裕民县| 旌德县| 深水埗区| 阜康市| 星子县| 林芝县| 黎城县| 梅州市| 通海县| 松江区| 沅陵县| 定结县| 苗栗市| 凤阳县| 英山县| 仙桃市| 内江市| 淳化县| 清涧县|