使用子查询和CTE提供数据之关系除
前面有讨论过交叉联接是关系乘法---将两个数据集相乘得到笛卡尔乘积。
从理论上来说,所有联接都是有限制的交叉联接,如内联接就是从两个数据集的关系乘积
中选取关键键值匹配的行。
一、关系除与关系乘、联接之间的关系以及关系除的种类
关系除与关系乘之间是互补。如果知道了笛卡尔乘积和一个乘数数据集,使用关系除
就可以推断出另一个乘数集。
有两个关系除:1、带余数的关系除 2、关系整除
一个经典的关系除示例是:哪些学生通过了所有必修课。
关系整除查询:只列出通过了所有必修课的学生。
带余数的关系除查询(也称为近似除):不仅列出所有通过了必修课的学生,还列出了通过
其他课程的学生。
联接/子查询和关系除用来解决不同类型的问题,下面是一些示例:
1、使用联接/子查询解决
Q1:谁参加过旅行团?
Q2:谁居住在营地所在的地区?
Q3:谁在其居住地参加了活动?
2、关系整除
Q1:谁参加过其居住州的每个旅行团,但没有参加过任何其他旅行团?
Q2:谁购买了每种风筝,但未购买任何其他商品?
Q3:哪些妇女(已离异)嫁过同一个男人,但没有同其他男人结过婚?
3、带余数的关系除
Q1:谁参加了其所在州的每个旅行团,且可能参加过其他旅行团?
Q2