一个看似很简单的SQL却难倒了很多人
一个选课表,有学生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却难倒了很多人的更多相关文章
- Linux学习笔记-第8天 - 看似很简单
		
这些东西已经看了三遍,已经能够理解了.看似很简单,希望真正在用的时候不会出差子.
 - 如何检索某个字段在sqlserver中的哪个些存储过程中?很简单的SQL语句。
		
SELECT obj.Name 存储过程名, sc.TEXT 存储过程内容 FROM syscomments sc INNER JOIN sysobjects obj ON sc.Id = obj.I ...
 - 记一个简单的sql查询
		
在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...
 - [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
		
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
 - 我的第一个WCF程序,很简单适合我等菜鸟
		
1.首先我罗列一下网站搜索并经过自己理解的WCF的含义: 1)WCF:(WIndows Communication Foundation)是由微软是由微软发展的一组数据通信的应用开发接口,可以翻译为W ...
 - 一个很简单的jQuery插件实例教程(菜鸟级)
		
很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ...
 - dubbo专题」dubbo其实很简单,就是一个远程服务调用的框架(1)
		
一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...
 - 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案
		
/** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...
 - 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破
		
我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...
 
随机推荐
- 查看ORACLE的实际执行计划
			
ORACLE的执行计划分为预估执行计划和实际执行计划.其中,你用Toad.PL/SQL Developer.SQL Developer.EXPLAIN PLAN FOR或者SET ATUOTRACE ...
 - 十五天精通WCF——第六天 你必须要了解的3种通信模式
			
wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦,单向,请求-响应,双工模式,其中的第二种“请求-响应“ 模式,这个大家不用动脑子都清楚,这一篇我大概来分析下. 一: ...
 - 编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,统计鱼的数量 co
			
package com.hanqi.test; public class Animal { private String name; private int legs; private int cou ...
 - 【转】MySQL 数据库存储引擎
			
原文地址:http://blog.jobbole.com/94385/ 简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是MySQl的特点,而且是一个插入 ...
 - A coroutine example: Streaming XML parsing using xml_parser
			
<?php error_reporting(E_ALL); /* Data can be send to coroutines using `$coroutine->send($data) ...
 - Debian deb源方法升级PHP软件包
			
学习Linxu以来,一直坚持编译方式安装软件包,貌似圈子里面也是都倾向于编译,可是搜索到的编译方法都是一堆复制粘贴来的指令, 每个人都这么编译, 却几乎没有人去写明那些五花八门的编译指令代表了什么,是 ...
 - 探究C语言中的前++和后++
			
小波带您探究c语言中的前++与后++: 欢迎吐槽,欢迎加QQ463431476. 欢迎关注! 现在来探究: 咱们先看第一个 i被赋值0,i++(后++)并没有输出1. 现在i被赋值0,++i,也 ...
 - CURL使用方法详解
			
php采集神器CURL使用方法详解 作者:佚名 更新时间:2016-10-21 对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...
 - web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记
			
hi 保持学习数量和质量 1.jQuery操作DOM元素 ----使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,a ...
 - 校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)
			
运行效果: 说明: 由于当年还不会使用多线程,所以很多获取用户点击的地方都是使用循环实现的...CPU占用率会比较高. 代码: //校园导游系统.cpp 1 #include <graphics ...