双层 not exist 嵌套

本文介绍了一种SQL查询方法,用于找出选读了全部课程的学生姓名。通过逐步分解查询语句,详细解释了如何筛选出那些没有未选课程的学生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STUDENT:

CREATE TABLE `student` (  
  `STUID` varchar(40) DEFAULT NULL,  
  `STUNAME` varchar(100) DEFAULT NULL,  
)  

COURSE:

CREATE TABLE `course` (  
  `COURSEID` varchar(40) DEFAULT NULL,  
  `COURSENAME` varchar(100) DEFAULT NULL  
)   

REGISTER:

CREATE TABLE `register` (  
  `STUID` varchar(40) DEFAULT NULL,  
  `COURSEID` varchar(40) DEFAULT NULL,  
  `GRADE` smallint(6) DEFAULT NULL  
)  

问题:检索选读全部课程的学生姓名

SELECT STUNAME FROM STUDENT  
    WHERE NOT EXISTS (  
        SELECT * FROM COURSE WHERE NOT EXISTS (  
            SELECT * FROM register WHERE register.COURSEID = COURSE.COURSEID AND  register.STUID =STUDENT.STUID)  
    )  

现在我们从后面的子查询向前分解:

1.所有未选过的课程的数据集:

SELECT * FROM COURSE WHERE NOT EXISTS (  
    SELECT * FROM register WHERE COURSEID = COURSE.COURSEID)  

2.所有没被某位学号为 @STUID 的学生选过的课程的记录集(@STUID学生的未选课程):

SELECT * FROM COURSE WHERE NOT EXISTS (  
    SELECT * FROM register WHERE register.COURSEID = COURSE.COURSEID AND  STUID =@STUID)  

3.遍历每一个主查询的学号,每一个学号都按第二筛选方法筛选出:没有未选课程的学生的学号。(不包括在第查询方法查询出的“有未学课程的学号的记录集”中的记录。)
请注意:用主查询中的 学生.学号 代替了@STUID。

SELECT STUNAME FROM STUDENT  
    WHERE NOT EXISTS (  
        SELECT * FROM COURSE WHERE NOT EXISTS (  
            SELECT * FROM register WHERE register.COURSEID = COURSE.COURSEID AND  register.STUID =STUDENT.STUID)  
    )  

这已经是整个查询语句,可以看出子查询中用学生.学号替换了第2步中的 @STUID,(没忘了吧,第二步求的是没有选修全部课程的某个学生)。

from http://blog.youkuaiyun.com/beiyetengqing

### 处理 'not exist' 错误的方法 #### PL/SQL 登录报错 ORA-27101 当遇到 `ORA-27101: shared memory realm does not exist` 的错误时,通常是因为实例未正常启动或者共享内存区域不可用。解决方案包括检查 Oracle 实例的状态并尝试重新启动数据库服务[^1]。 #### Chrome 扩展消息传递失败 如果在开发 Chrome 插件过程中遇到了 `Could not establish connection. Receiving end does not exist.` 的错误,则可能是目标标签页尚未加载内容脚本或接收端不存在的情况所致。可以通过监听页面完全加载后再发送消息来规避此问题[^2]: ```javascript // background.js 示例代码 chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { chrome.tabs.sendMessage(tabs[0].id, { message: "hello" }); }); ``` #### React 中 useRef 类型不匹配 针对 React 使用 `useRef` 和 `useImperativeHandle` 导致的类型错误(如 `'xxx' does not exist on type 'never'`),推荐通过定义明确的接口而非简单忽略编译器警告的方式解决问题[^3]: ```typescript import { forwardRef, Ref } from 'react'; interface MyComponentProps {} interface MyComponentRef { start(): void; } const MyComponent = forwardRef((props: MyComponentProps, ref: Ref<MyComponentRef>) => { const componentRef = useRef<{ start: () => void } | null>(null); useImperativeHandle(ref, () => ({ start: () => { if (componentRef.current !== null) { console.log('Start called'); } }, })); return <div>My Component</div>; }); export default MyComponent; ``` #### PostgreSQL 枚举类型操作异常 关于 PostgreSQL 数据库中的枚举字段查询引发 `operator does not exist` 错误的情形,可以采用显式转换机制将输入参数映射到对应的枚举类型上以修复该类问题[^4]: 方式一: ```sql SELECT * FROM sys_user WHERE del_flag = 0 AND role = CAST(:role AS user_role); ``` 方式二: ```sql SELECT * FROM sys_user WHERE del_flag = 0 AND role = :role::user_role; ``` #### Cscope 文件缺失提示 最后,在使用 cscope 工具构建索引文件的过程中若收到 `cscope file does not exist` 提醒,应确认当前目录下是否存在有效的源码文件列表以及是否已执行必要的初始化命令[^5]: ```bash alias mkcscopefile='find $(pwd) -name "*.h" -o -name "*.c" -o -name "*.cpp" > cscope.files' alias mktags='ctags -R; cscope -bR' ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值