文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MS SQL Server排查多列之间的值是否重复的功能实现

2024-09-18 20:49

关注

需求

在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据,主要包括题目和选项字段(如单选选择项或多选选择项) ,一个合理的数据存储应该保证这些选项列之间不应该出现重复项目数据,比如选项A不应该和选项B的值重复,选项B不应该和选项C的值重复,以此穷举类推,以保证这些选项之间不会出现重复的值。本文将介绍如何利用 group by  、having 语句来实现这一需求,主要实现如下功能:

(1)上传 EXCEL 版试题题库到 MS SQL SERVER 数据库进行导入

(2)通过 union all  将各选项列的数据进行 转记录行的合并

(3)通过 group by 语句 和 count 聚合函数统计重复情况

(4)通过 having 子句筛选出重复记录

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

.netFramework 4.7.2

数据样本设计

假设有 EXCEL 数据题库如下:

MS SQL Server排查多列之间的值是否重复的功能实现

如图我们假设设计了错误的数据源,第4题的A选项与D选项重复,第8题的A选项与C选项重复了。

MS SQL Server排查多列之间的值是否重复的功能实现

题库表 [exams] 设计如下:

序号字段名类型说明备注
1sortidint排序号题号,唯一性
2etypenvarchar试题类型如多选、单选
3etitlenvarchar题目
4Anvarchar选项A
5Bnvarchar选项B
6Cnvarchar选项C
7Dnvarchar选项D

功能实现

上传EXCEL文件到数据库

导入功能请参阅我的文章C#实现Excel合并单元格数据导入数据集详解_C#教程_编程网(www.lsjlt.com) (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 (选项) 字段进行分组统计,使用 count 聚合函数统计选项在 题号 中出现的个数,如下封装:

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 语句对结果集进行过滤,排查出问题记录,如下语句:

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

在查询分析器运行SQL语句,显示如下图:

MS SQL Server排查多列之间的值是否重复的功能实现

由此可以看出,通过查询可以排查出第4题和第8题出现选项重复问题。 

小结

我们可以继续完善对结果的分析,以标注问题序号是哪几个选项之间重复,可通过如下语句实现:

 
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

关键语句: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

这个用于对比每一个选项列,得到对应的选项列名,运行查询分析器,结果显示如下:

MS SQL Server排查多列之间的值是否重复的功能实现

这样我们可以更直观的看到重复的选项列名是哪几个,以更有效帮助我们改正问题。在实际的应用中每一个环节我们都难免会出现一些失误,因此不断的根据实际的发生情况总结经验,通过计算来分析,将问题扼杀在摇篮里,以最大保证限度的保证项目运行效果的质量。

至此关于排查多列之间重复值的问题就介绍到这里,感谢您的阅读,希望本文能够对您有所帮助。

以上就是MS SQL Server排查多列之间的值是否重复的功能实现的详细内容,更多关于MS SQL Server排查值是都重复的资料请关注编程客栈(www.lsjlt.com)其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯