实现集合差集(Transact-SQL Cookbook)

 2.3.1问题
如果你想计算两个集合之间的差异。例如,你想找出Andrew选取而Cindy没有选取的课程。这个问题的一个变异是,你也想从其它所有的集合并集中减去一个集合。换句话说,Cindy想通过列出所有她的朋友已经完成的而她还没有完成的学期报告找出她的朋友是怎么做的。

2.3.2解决方案
在这个演示中有两个问题。第一个是从一个集合中简单地减去另一个。第二个是从其它所有集合的并集中减去一个集合。两个问题的解决方案实际上是同一个,因为多个集合的并集只是一个更大的集合。

2.3.2.1从一个集合中减去另一个
考虑一个问题:找出Andrew已经完成而Cindy没有完成的学期报告。这个问题包括两个集合:Andrew已经完成的报告和Cindy已经完成的报告。下面的查询返回这两个集合间的差集:

SELECT  s.CourseId, s.TermPaper
FROM  Students s
WHERE  s.StudentName = ' Andrew '   AND  
   
NOT   EXISTS (
      
SELECT   *   FROM  Students s1 
      
WHERE  s1.CourseId = s.CourseId  AND  
         s1.TermPaper
= s.TermPaper  AND  
         s1.StudentName
= ' Cindy ' )

查询的结果:

CourseId  TermPaper   

-- ------- ----------- 

ACCN101   
4

ACCN101   
3

2.3.2.2从其它所有集合的的并集中减去一个集合

这个问题的一个微小的变化是从其它所有集合的并集中减去一个特定的集合。这就引出了我们的问题的第二部分—找出Cindy的朋友完成的Cindy未完成的学期报告。下面的查询完成这个功能:

SELECT  s.StudentName, s.CourseId, s.TermPaper
FROM  Students s
WHERE  s.StudentName <> ' Cindy '   AND
   
NOT   EXISTS (
      
SELECT   *   FROM  Students s1 
      
WHERE  s.CourseId = s1.CourseId  AND  
         s.TermPaper
= s1.TermPaper  AND  
         s1.StudentName
= ' Cindy ' )

查询返回以下结果:

StudentName   CourseId  TermPaper   

-- ----------- --------- ----------- 

Andrew        ACCN101   
4

Andrew        ACCN101   
3

Bert          ACCN101   
3

现在我们知道学校所有的人,只有Andrew和Bert完成了Cindy没有完成的学期报告。

2.3.3讨论

找出两个集合之间的不同需要使用子查询,它通常对CPU和内存消耗是一项昂贵的任务。解决这种问题的关键在于定义解决方案包括的集合。例如,Cindy完成的学期报告集合是在这个示例中讨论的问题中都有的集合。一旦你定义了你的集合,你就能使用带有NOT EXISTS的SELECT语句返回两个集合间的差集。

2.3.3.1 从一个集合中减去另一个集合

第一个SELECT语句,从Andrew写的学期报告集合中减去Cindy写的学期报告。外面的SELECT语句返回所有Andrew写的学期报告。NOT EXISTS修改了那个查询返回的结果,所以它们可以排除所有Cindy完成的学期报告,内部的SELECT语句定义了Cindy完成的报告。整个查询返回的结果是Andrew写了,但Cindy没写的报告。

2.3.3.2 从其它所有的集合中减去一个集合

第二个SELECT语句从其它所有的集合中减去Cindy写的学期报告。解决这个问题的方法与上一个问题大致相同。唯一的不同是外面的SELECT语句定义的集合包括所有学生的学期报告而不是Cindy的。

第二个SELECT语句返回的结果是所有其它学生上交的学期报告列表,而不是Cindy的。因为多个学生可以上交同样的学期报告,在结果中包括学生姓名使得结果变得有意义。Cindy想要知道 提交了她没有提交的报告。

2.3.3.3 从一个集合中减去多个集合
第二个查询实际上导致了第三种计算集合差集的解决方案—从一个集合中减去多个集合。假设你想要Andrew写的但其他学生没有写的报告列表,你可以使用下列查询生成结果:

SELECT  s.CourseId, s.TermPaper
FROM  Students s
WHERE  s.StudentName = ' Andrew '   AND  
   
NOT   EXISTS (
      
SELECT   *   FROM  Students s1 
      
WHERE  s1.CourseId = s.CourseId  AND  
         s1.TermPaper
= s.TermPaper  AND  
         s1.StudentName
<> ' Andrew ' )

在这个例子中,外面的SELECT语句返回Andrew写的报告列表。这是起点,子查询定义了其他学生完成的报告列表。两个集合进行了相减,结果就是只有Andrew提交的学期报告列表。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智慧校园建设方案旨在通过先进的信息技术,为师生提供一个全面智能的感知环境和综合信息服务平台。该方案正处在从信息化第二阶段向第三阶段过渡的关键时期,致力于实现校园服务和管理的全面智能化。 方案的核心目标是构建一个集成的校园地理信息服务平台,通过该平台实现资产管理、房产信息管理、基础设施管理、绿化管理和能源监测管理等功能。同时,该平台将提供校园漫游、信息服务、指引服务、活动通知、用房服务和客流统计等多样化服务,以促进校园的和谐、绿色、平安和便捷。 在技术层面,智慧校园建设方案强调系统集成能力、数据统一分析能力、系统资源共享能力以及大数据集成处理能力。通过这些能力,可以构建统一的校园地理信息平台,提供综合的应用支撑和管理能力,实现系统平滑演进。 应用方向上,智慧校园建设方案围绕和谐校园、绿色校园、平安校园和掌上校园四个维度展开。和谐校园侧重于提供校园漫游、信息服务、指引服务等,增强师生的校园体验。绿色校园则关注资产管理和能源监测,推动校园的可持续发展。平安校园通过视频监控、数字巡更等手段,确保校园安全。掌上校园则利用移动设备,实现校园服务的随时随地访问。 最终,智慧校园建设方案将通过三维虚拟校史馆、720度成像技术等创新应用,提供身临其境的校园漫游体验,同时通过可视化管理和数据分析,优化校园资源配置和运营效率,实现校园管理的智能化和现代化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值