1个回答
展开全部
1、首先,这条sql 使用了(not exists),这条sql思路大体是这样的:
某个order,取名为R, 如果10308这个order下某个订单商品不在R订单下的订单商品中,那么R这个order就不符合条件;
2、sql拆解分析:首先明确not exists 的意思是:其后没有数据返回,那么被select的数据才被加入到结果集中;
1)第一个not exists 和第二个not exists之间的sql:
"select 1 from OrderItems” a where a.OrderID=10308"
这个查询的意思是:查询出订单为10308的所有订单商品;其后面的not exists就是对这个结果集的过滤;
2)第二个not exists 后面的sql:
"select 1 from OrderItems b where p.OrderID=b.OrderID and a.ProduceID=b.ProductID"
这个查询的意思是:10308这个订单的订单商品是否存在与p这个订单中的订单商品中;
3)将前两步中的sql结合起来:
“select 1 from OrderItems a where a.OrderID=10308
and not exists
(select 1 from OrderItems b where p.OrderID=b.OrderID and a.ProduceID=b.ProduceID)”
这个sql的意思是:在10308这个订单的所有订单商品中,是否存在某个商品不再p订单的订单商品中;
4)最后对Orders的筛选sql:
“select * from orders p where not exists (第三步的查询结果)”
第三步中,如果存在那种情况,那么 第三步返回的数据是1,所以这条order就被过滤掉了,不会添加到结果集中;
如果存在那种情况,那么 第三步没有返回数据,所以这条order就会添加到结果集中;
*能力有限,只能讲到这种程度,如有不妥之处,海涵、见谅,兄弟;欢迎指正!
某个order,取名为R, 如果10308这个order下某个订单商品不在R订单下的订单商品中,那么R这个order就不符合条件;
2、sql拆解分析:首先明确not exists 的意思是:其后没有数据返回,那么被select的数据才被加入到结果集中;
1)第一个not exists 和第二个not exists之间的sql:
"select 1 from OrderItems” a where a.OrderID=10308"
这个查询的意思是:查询出订单为10308的所有订单商品;其后面的not exists就是对这个结果集的过滤;
2)第二个not exists 后面的sql:
"select 1 from OrderItems b where p.OrderID=b.OrderID and a.ProduceID=b.ProductID"
这个查询的意思是:10308这个订单的订单商品是否存在与p这个订单中的订单商品中;
3)将前两步中的sql结合起来:
“select 1 from OrderItems a where a.OrderID=10308
and not exists
(select 1 from OrderItems b where p.OrderID=b.OrderID and a.ProduceID=b.ProduceID)”
这个sql的意思是:在10308这个订单的所有订单商品中,是否存在某个商品不再p订单的订单商品中;
4)最后对Orders的筛选sql:
“select * from orders p where not exists (第三步的查询结果)”
第三步中,如果存在那种情况,那么 第三步返回的数据是1,所以这条order就被过滤掉了,不会添加到结果集中;
如果存在那种情况,那么 第三步没有返回数据,所以这条order就会添加到结果集中;
*能力有限,只能讲到这种程度,如有不妥之处,海涵、见谅,兄弟;欢迎指正!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询