用in和用exists的区别,看《sql必知必会》时遇到的问题,请教两个查询为何结果不同,第二个查询错在哪儿?

[复制链接]
查看11 | 回复4 | 2021-1-27 06:28:44 | 显示全部楼层 |阅读模式
今天在学利用子查询进行过滤时,照着书中用in的方式改用exists,结果不一样
--使用in查找订购物品(prod_id)为RGAN01的顾客信息
SELECTCUST_NAME,CUST_CONTACT
FROMCUSTOMERS
WHERECUST_IDIN
(SELECTCUST_ID
FROMORDERS
WHEREORDER_NUMIN
(SELECTORDER_NUMFROMORDERITEMSWHEREPROD_ID='RGAN01'));
以下为查询结果:


-使用exists查找订购物品为RGAN01d的顾客信息
SELECTCUST_NAME,CUST_CONTACT
FROMCUSTOMERS
WHEREEXISTS
(SELECTCUST_ID
FROMORDERS
WHEREEXISTS
(SELECTORDER_NUMFROMORDERITEMSWHEREPROD_ID='RGAN01'));
以下为查询结果:


请教为何两次结果不同?使用in和exists的差别是啥?

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:28:44 | 显示全部楼层
加上ORDERS表和ORDERITEMS表字段相等的条件
回复

使用道具 举报

千问 | 2021-1-27 06:28:44 | 显示全部楼层
SELECTCUST_NAME,CUST_CONTACT
FROMCUSTOMERSa
WHEREEXISTS
(SELECT*
FROMORDERSb
WHEREa.CUST_ID=c.CUST_IDandEXISTS
(SELECT*FROMORDERITEMScWHEREPROD_ID='RGAN01'andb.ORDER_NUM=c.ORDER_NUM)
);
这样执行一下,结果应该是一样的
回复

使用道具 举报

千问 | 2021-1-27 06:28:44 | 显示全部楼层
嗯,谢谢,忘加条件了,还有顺便说下,你写的第一个where子句里的条件应该是a.CUST_ID=b.CUST_ID
回复

使用道具 举报

千问 | 2021-1-27 06:28:44 | 显示全部楼层
你首先要知道in和exists有什么区别,一个in是可以返回值,而exists却只是告诉你它在不在而已
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行