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

MS SQL Server排查多列之間的值是否重復(fù)的功能實(shí)現(xiàn)

 更新時間:2024年09月18日 09:23:48   作者:初九之潛龍勿用  
在日常的應(yīng)用中,排查列重復(fù)記錄是經(jīng)常遇到的一個問題,但某些需求下,需要我們排查一組列之間是否有重復(fù)值的情況,本文給大家介紹了MS SQL Server排查多列之間的值是否重復(fù)的功能實(shí)現(xiàn),需要的朋友可以參考下

需求

在日常的應(yīng)用中,排查列重復(fù)記錄是經(jīng)常遇到的一個問題,但某些需求下,需要我們排查一組列之間是否有重復(fù)值的情況。比如我們有一組題庫數(shù)據(jù),主要包括題目和選項字段(如單選選擇項或多選選擇項) ,一個合理的數(shù)據(jù)存儲應(yīng)該保證這些選項列之間不應(yīng)該出現(xiàn)重復(fù)項目數(shù)據(jù),比如選項A不應(yīng)該和選項B的值重復(fù),選項B不應(yīng)該和選項C的值重復(fù),以此窮舉類推,以保證這些選項之間不會出現(xiàn)重復(fù)的值。本文將介紹如何利用 group by  、having 語句來實(shí)現(xiàn)這一需求,主要實(shí)現(xiàn)如下功能:

(1)上傳 EXCEL 版試題題庫到 MS SQL SERVER 數(shù)據(jù)庫進(jìn)行導(dǎo)入

(2)通過 union all  將各選項列的數(shù)據(jù)進(jìn)行 轉(zhuǎn)記錄行的合并

(3)通過 group by 語句 和 count 聚合函數(shù)統(tǒng)計重復(fù)情況

(4)通過 having 子句篩選出重復(fù)記錄

范例運(yùn)行環(huán)境

操作系統(tǒng): Windows Server 2019 DataCenter

數(shù)據(jù)庫:Microsoft SQL Server 2016

.netFramework 4.7.2

數(shù)據(jù)樣本設(shè)計

假設(shè)有 EXCEL 數(shù)據(jù)題庫如下:

如圖我們假設(shè)設(shè)計了錯誤的數(shù)據(jù)源,第4題的A選項與D選項重復(fù),第8題的A選項與C選項重復(fù)了。

題庫表 [exams] 設(shè)計如下:

序號字段名類型說明備注
1sortidint排序號題號,唯一性
2etypenvarchar試題類型如多選、單選
3etitlenvarchar題目
4Anvarchar選項A
5Bnvarchar選項B
6Cnvarchar選項C
7Dnvarchar選項D

功能實(shí)現(xiàn)

上傳EXCEL文件到數(shù)據(jù)庫

導(dǎo)入功能請參閱我的文章C#實(shí)現(xiàn)Excel合并單元格數(shù)據(jù)導(dǎo)入數(shù)據(jù)集詳解_C#教程_腳本之家 (jb51.net)這里不再贅述。

SQL語句

首先通過 UNION ALL 將A到D的各列的值給組合成記錄集 a,代碼如下:

	select A as item,sortid from exams  
	 union all
	select B as item,sortid from exams  
	 union all
	select C as item,sortid from exams  
	 union all
	select D as item,sortid from exams  

其次,通過 group by 對 sortid (題號) 和 item (選項) 字段進(jìn)行分組統(tǒng)計,使用 count 聚合函數(shù)統(tǒng)計選項在 題號 中出現(xiàn)的個數(shù),如下封裝:

select item,count(item) counts,sortid from (
	select A as item,sortid from exams  
	 union all
	select B as item,sortid from exams  
	 union all
	select C as item,sortid from exams  
	 union all
	select D as item,sortid from exams  
) a group by sortid,item order by sortid

最后使用 having 語句對結(jié)果集進(jìn)行過濾,排查出問題記錄,如下語句:

select item,count(item) counts,sortid from (
	select A as item,sortid from exams  
	 union all
	select B as item,sortid from exams  
	 union all
	select C as item,sortid from exams  
	 union all
	select D as item,sortid from exams  
) a group by sortid,item   having count(item)>1 order by sortid

在查詢分析器運(yùn)行SQL語句,顯示如下圖:

由此可以看出,通過查詢可以排查出第4題和第8題出現(xiàn)選項重復(fù)問題。 

小結(jié)

我們可以繼續(xù)完善對結(jié)果的分析,以標(biāo)注問題序號是哪幾個選項之間重復(fù),可通過如下語句實(shí)現(xiàn):

 
select case when A=item then 'A' else ''end+
case when B=item then 'B' else '' end +
case when C=item then 'C' else '' end +
case when D=item then 'D' else '' end tip
,b.* from  
(select item,count(item) counts,sortid from (
	select A as item,sortid from exams  
	 union all
	select B as item,sortid from exams  
	 union all
	select C as item,sortid from exams  
	 union all
	select D as item,sortid from exams  
) a group by sortid,item   having count(item)>1 ) b,exams c where b.sortid=c.sortid

關(guān)鍵語句:case when A=item then 'A' else ''end+
case when B=item then 'B' else '' end +
case when C=item then 'C' else '' end +
case when D=item then 'D' else '' end tip

這個用于對比每一個選項列,得到對應(yīng)的選項列名,運(yùn)行查詢分析器,結(jié)果顯示如下:

這樣我們可以更直觀的看到重復(fù)的選項列名是哪幾個,以更有效幫助我們改正問題。在實(shí)際的應(yīng)用中每一個環(huán)節(jié)我們都難免會出現(xiàn)一些失誤,因此不斷的根據(jù)實(shí)際的發(fā)生情況總結(jié)經(jīng)驗,通過計算來分析,將問題扼殺在搖籃里,以最大保證限度的保證項目運(yùn)行效果的質(zhì)量。

至此關(guān)于排查多列之間重復(fù)值的問題就介紹到這里,感謝您的閱讀,希望本文能夠?qū)δ兴鶐椭?/p>

以上就是MS SQL Server排查多列之間的值是否重復(fù)的功能實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于MS SQL Server排查值是都重復(fù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

屏山县| 唐河县| 曲水县| 丰城市| 会昌县| 扬州市| 彝良县| 翁源县| 金秀| 启东市| 吉首市| 鸡西市| 盐边县| 西宁市| 乐都县| 布尔津县| 禹州市| 库车县| 崇文区| 普洱| 化德县| 沂南县| 石渠县| 香格里拉县| 弋阳县| 南昌县| 任丘市| 忻州市| 新闻| 朝阳区| 会同县| 西乌珠穆沁旗| 大埔县| 凉城县| 同心县| 修水县| 大理市| 八宿县| 铁岭县| 宁阳县| 木里|