用sql来判断子集
来源:互联网 发布:淘宝链接地址怎么弄 编辑:程序博客网 时间:2024/05/16 17:56
create table ken.sc(id integer,cno integer);.
insert into ken.sc values(1,2);
insert into ken.sc values(1,3);
insert into ken.sc values(2,1);
insert into ken.sc values(2,2);
insert into ken.sc values(2,3);
insert into ken.sc values(2,4);
insert into ken.sc values(3,1);
insert into ken.sc values(3,2);
insert into ken.sc values(4,5);
select x.id
from ken.sc as x
where not exists(
select * from ken.sc y
where y.id=1 and not exists(
select * from ken.sc z
where z.id=x.id and z.cno=y.cno));
乍一看逻辑上非常的绕不知所以然,其实分解来看还是可以容易的理解的
1.首先分解第一步
select * from ken.sc y
where y.id=1 and not exists(
select * from ken.sc z
where z.cno=y.cno)
这是一个空结果 是找select * from ken.sc y where y.id=1 在全集中不存在的结果 答案肯定是没有 因为至少它子集肯定是在全集中的。
2.主要理解的突破口是第二步
把
select * from ken.sc y
where y.id=1 and not exists(
select * from ken.sc z
where z.id=1 and z.cno=y.cno) 拿出来 分别的尝试 1~4 看一下结果
1和2的结果都是空
3的结果是
1 3
4的结果是
1 1
1 3
1 2
也可以推断出 这个query查出来的是 select * from ken.sc y where y.id=1 在后边的结果集中不存在的情况,也就是对比select * from ken.sc y where y.id=1 后边的结果集在z缺的记录 可以看成是补集
3.最后就比较容易了z.id=x.id 会和刚才第二步的步骤一样 把所有的值都进行对比(1~4),然后最外层的not exists会把后边不存在的结果查出来,也就是除了缺子集中的元素的记录都会被查出来 很明显 只有1自己和id为2的不缺,所以在去重之后结果是 1和2
-----------------------------
另外我用了另一种比较笨的方法也实现了上面的功能
where cno in (select cno from ken.sc where id=1)
group by id
having count(cno)=(select count(cno) from ken.sc where id=1);
- 用sql来判断子集
- 【Scala】通过【foldLeft】来判断一个List是否是另一个List的子集
- 一个字符串子集判断的算法
- matlab-高数 判断子集 ismember
- matlab-高数 判断真子集
- JQ-判断子集-作用父集-[基础]
- C 判断字符串是否是子集
- sql语句来判断时间间隔的长短
- SQL中的CTE,查询所有的子集(子集的子集)比游标效率高
- 子集
- 子集
- 子集
- 子集
- 子集
- 用sql 来生成索引
- 用CSS/Javascript来判断浏览器类型
- 怎么用XML来判断用户权限
- 用php语言来判断浏览器类
- 关于开发控制window 98的仪器总结
- SDUT 3322 DFS暴力 数论
- Read && Write
- [超源点:还是最短路的变形]hdu2066
- import opencv for Android 例程总是显示错去
- 用sql来判断子集
- Matlab优化函数中options选项的修改
- javascript 对象
- Leetcode-Median of Two Sorted Arrays
- Adaboost-积分图计算
- java中hashcode()和equals()的的用法整理
- json的使用
- 前端开发资源汇总
- 使用netbeans实现一个简易计算器