暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 表联接仅当记录存在时

askTom 2017-05-08
153

问题描述

我有以下表格...

学生信息:
学生证 *
学生姓名
等。

可用课程:
学期 *
课程ID *
主题
课程编号
课程名称

注册:
学生证 *
学期 *
课程ID *

* 指定主键

正如您可能已经猜到的那样,实际表比上面的示例要复杂一些。但是,解决方案仍然是相同的。

现在问题来了。我需要一些SQL,只要该学期没有注册记录,就可以为我提供所有课程的课程信息。如果这个学期有注册,那么我只想看看有注册记录的课程。

声明它的另一种方式是,我希望查看 “可用课程” 中的所有记录,除非给定学期的 “注册” 中至少存在一条记录。如果是这样,那么我只想看到具有相应 “注册” 记录的 “可用课程”。

最后的代码在某些PL/SQL中创建一个游标。我宁愿只编辑光标。关于如何在保持合理响应时间的同时正确地进行此工作的结果的任何建议?

谢谢,
Bryon

专家解答

“另一种声明方式是,我希望查看“ 可用课程 ”中的所有记录,除非给定学期的“ 注册 ”中至少存在一个记录,如果是这种情况,那么我只想查看具有相应“ 注册 ”记录的“ 可用课程 ”。”


在SQL中,可以是:

select *
from available_courses a
where not exists 
  ( select 1 
    from   registration
    where  semester = ...
union all
select *
from available_courses a
     registrations r
where r.semester = ...
and   a.course = r.course


or something like this where we outer join and collect a count of found registrations.  Then we want either all records (regcount = 0) or just those that had a match 


select *
from (
select *, count(r.course) over () as tot_reg
from available_courses a
     registrations r
where r.semester(+) = ...
and   a.course = r.course(+)
)
where tot_reg = 0 or
 ( tot_reg > 0 and r.course is not null )
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论