一个选课表,有学生id,课程id,老师id,要求选出同时选了语文和数学的学生

USE [tempschool]
GO
/****** 对象: Table [dbo].[SelectC] 脚本日期: 07/02/2015 11:04:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SelectC](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Sid] [int] NULL,
[Cid] [int] NULL,
[Tid] [int] NULL,
CONSTRAINT [PK_SelectC] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

插入一些模拟数据, 假设CID=1和CID=2的分别是语文和数学,那么根据下图,同时选了语文和数学的应该是1号和5号学生

先不要看答案,在脑子里写一个sql,然后再往下看

一开始得到了很多错误的答案,也是最容易出现的答案

--错误的答案,一条记录都找不到
select * from selectC where cid=1 and cid=2 --错误的答案,只选了一门语文的学生也会出现在记录中
select * from selectC where cid=1 or cid=2

  

那么正确的答案应该怎么做呢,目前我找到3种方法,

方法一:

select a.sid from
SelectC as a left join SelectC as b on b.sid = a.sid
where a.cid =1 and b.cid =2

  

对了,笛卡尔乘积,无限关联就可以选出同时选了语文数学英语等等等等的情况  

方法二:

                SELECT sid
FROM SelectC
WHERE (cid = 1) OR
(cid = 2)
GROUP BY sid
HAVING (COUNT(*) >= 2)

 这是第二种,首先先通过条件or选择出所有的语文或者数学的,然后根据sid汇总,只要count数量大于2的就是同时选择了语文和数学的,如果要扩展再多的就是修改count的数量和or的条件

方法三:

select distinct  sid from selectC where
sid in(select sid from selectc where cid = 1)
and sid in(select sid from selectc where cid = 2)

第三种方法似乎效率就比较低了,需要用in来做查询。

不知道大家还有没有其他的写法

一个看似很简单的SQL却难倒了很多人的更多相关文章

  1. Linux学习笔记-第8天 - 看似很简单

    这些东西已经看了三遍,已经能够理解了.看似很简单,希望真正在用的时候不会出差子.

  2. 如何检索某个字段在sqlserver中的哪个些存储过程中?很简单的SQL语句。

    SELECT obj.Name 存储过程名, sc.TEXT 存储过程内容 FROM syscomments sc INNER JOIN sysobjects obj ON sc.Id = obj.I ...

  3. 记一个简单的sql查询

    在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...

  4. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  5. 我的第一个WCF程序,很简单适合我等菜鸟

    1.首先我罗列一下网站搜索并经过自己理解的WCF的含义: 1)WCF:(WIndows Communication Foundation)是由微软是由微软发展的一组数据通信的应用开发接口,可以翻译为W ...

  6. 一个很简单的jQuery插件实例教程(菜鸟级)

    很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ...

  7. dubbo专题」dubbo其实很简单,就是一个远程服务调用的框架(1)

    一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...

  8. 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...

  9. 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破

    我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...

随机推荐

  1. JavaScript Patterns 6.5 Inheritance by Copying Properties

    Shallow copy pattern function extend(parent, child) { var i; child = child || {}; for (i in parent) ...

  2. SQL Server 中的逻辑读与物理读

    首先要理解逻辑读和物理读: 预读:用估计信息,去硬盘读取数据到缓存.预读100次,也就是估计将要从硬盘中读取了100页数据到缓存. 物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读 ...

  3. R语言中的循环函数(Grouping Function)

    R语言中有几个常用的函数,可以按组对数据进行处理,apply, lapply, sapply, tapply, mapply,等.这几个函数功能有些类似,下面介绍下这几个函数的用法. Apply 这是 ...

  4. 【hadoop】——MapReduce解压缩实现

    转载请注明出处:http://www.cnblogs.com/zhengrunjian/p/4527269.html 1作为输入 当压缩文件做为mapreduce的输入时,mapreduce将自动通过 ...

  5. python基础(六)循环

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进来表示程序 ...

  6. 烂泥:Linux系统与windows系统文件同步

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章中,我们介绍了有关Linux系统之间的文件同步,这篇文章我们来介绍下,有关Linux系统与windows系统,以及windows系统与windo ...

  7. linux 分区 物理卷 逻辑卷

    今天我们主要说说分区.格式化.SWAP.LVM.软件RAID的创建哈~ 格式化 查看当前分区:fdisk   -l 这个命令我们以前是讲过的,我现在问下,ID那项是什么意思? 83 是代表EXT2和E ...

  8. TCP校验和的原理和实现

        http://blog.csdn.net/zhangskd/article/details/11770647 分类: Linux TCP/IP Linux Kernel 2013-09-24 ...

  9. java 判断两个时间相差的天数

    1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的   ...

  10. Spring AOP 开发中遇到问题:Caused by: java.lang.IllegalArgumentException: warning no match for this type name: com.xxx.collector.service.impl.XxxServiceImpl [Xlint:invalidAbsoluteTypeName]

    在网上找了很多,都不是我想要的,后来发现是我在springaop注解的时候 写错了类名导致的这个问题 @Pointcut("execution(* com.xxx.collector.ser ...