两分钟搞定 sql 语句 not exisits 多层嵌套除法的写法

**

例子: 王珊版的数据库系统概论第二章课后习题

**

求至少用了供应商S1所供应的全部零件的工程号JNO


首先拿到这个题,涉及的表只有SPJ表,且看得出来使用除法来解决这个问题更加简单。。

可除法一般涉及多层 not exists嵌套循环,不好掌握。我给大家介绍一下一个简答的快捷方式来用sql语句写好数据库除法。。

1.首先明确需要查询的结果,被除数和除数。

比如在这一题中 查询结果是JNO,被除数是SPJ表投影出来的PNO,JNP两列,除数是当SNO='S1’时投影的PNO。
我们通常这样做!
1.1 把查询结果放在最外层
1.2 把除数放在中间层(加上除数的选择条件)
1.3 把被除数放在最里层 并且条件引入到最里层

写出sql语句得到

select Distinct JNO
From SPJ SPJX
where not exists
(	select * 
	from SPJ SPJY
	where SPJY.SNO='S1' AND not exists(
	select *
	from SPJ SPJZ
	where SPJZ.JNO = SPJX.JNO AND SPJZ.PNO = SPJY.PNO
	) 
)

下面详细的分析步骤:

–1.明确 要查询出的结果 被除数 除数
–这一题我们需要查询的是JNO 被除数是SPJ表投影出来的PNO,JNO两列 除数是投影出来当SNO='S1’的PNO
–我们把除数放在第一个not exists后并加上它必要的条件(它的选择条件为SNO=‘S1’)
–我们把被除数放在第二个not exists后
–接着最里层查询与两个外层查询找到关联属性引到where语句中

–2.关键的步骤是如何找出最里层与外层之间关联的关系呢?
–可以看出最外层和最里层的之间的连接需要依靠JNO,最外层和次里层的连接需要PNO。
因为被除数的两个属性JNO,PNO。除数的属性在SNO='S1’选择PNO
所以里层的被除数要和中间层的除数PNO属性相关联,除数的JNO属性与外层的JNO相关联。
–3.怎么看出来的呢?
–首先看除数,除数筛选的是PNO属性列。直接在里层写SPJY.PN0 = SPJZ.PNO
–在看被除数,被除数查询出来的结果是JNO。直接在里层写SPJY.JNO = SPJX.JNO
–然后加上除数的选择条件就完成了除法sql语句

猜你喜欢

转载自blog.csdn.net/weixin_43752167/article/details/90676465