(1)自连接不适合操作大表,也就是记录多的表,原因是自连接至少有两张表参与,并进行笛卡尔全集,连接之后的记录数就是单张表记录数的平方(笛卡尔积行数是两张表行数的乘积),如果有三张表记录数就是原来的三次方,如果原来的表包含的记录数过多,连接之后的结果就会很大,所以自连接不适合操作大表。
解决办法:层次查询。注意层次查询是单表查询,不存在第二张表!因为只有在一张表的情况下才不会产生笛卡尔积,才能解决这个问题。
层次查询在某些情况下可以替代自连接,本质上是单表查询。
例子:
查询员工和老板的姓名
自连接查询:


层次查询

只有从根节点开始时才可以使用 * is null 的格式,

此外层次查询的树的深度用level表示,可以在select语句中加入level就可以得到深度的查询结果,还可以对查询结果进行排序如order by level

比较自连接和层次查询的优劣:
- 自连接得到的查询结果比较直观但是不适合操作大表;
- 层次查询只涉及一张表,不产生笛卡尔积,但是得到的结果不够直观。
3172

被折叠的 条评论
为什么被折叠?



