当前位置: 首页 > 知识库问答 >
问题:

为什么我需要SQL中一个表的两个副本?

钮博裕
2023-03-14

这里是SQL初学者,在我的大学课程中,我们有以下模式。

学生(snum:整数,sname:字符串,专业:字符串,级别:字符串,年龄:整数)

类(名称:字符串,meets_at:字符串,房间:字符串,fid:整数)

已注册(snum:整数,cname:字符串)

教员(fid:整数,fname:字符串,deptid:整数)

其中一个练习如下:

找出同时参加两个班的所有学生的名字。

下面是它的SQL语句

SELECT DISTINCT S.SNAME

FROM STUDENT S

WHERE S.SNUM IN (SELECT E1.SNUM

             FROM ENROLLED E1, ENROLLED E2, CLASS C1, CLASS C2

              WHERE E1.SNUM = E2.SNUM AND E1.CNAME <> E2.CNAME

               AND E1.CNAME = C1.NAME

              AND E2.CNAME = C2.NAME AND 

              C1.MEETS_AT = C2.MEETS_AT);

在我的子问题中,为什么要使用注册关系和类关系的两个副本。

共有2个答案

李新霁
2023-03-14

子查询两次引用注册表,因为它需要检索注册了不止一次的学生;两次,因为它只需要检索注册了不止一个类的学生。

考虑一个更简单的查询:

select C1.NAME, C2.NAME
from   CLASS C1, CLASS C2
where  C1.MEETS_AT = C2.MEETS_AT
and    C1.NAME <> C2.NAME;

这将为您提供同时开会的课程列表。有必要将整个类集合与自身进行比较,寻找那些在时间具有相同的集合的类。最后一行排除了同名的类。

您的子查询为同时参加多个课程的学生检索学生编号列表:

SELECT E1.SNUM
  FROM ENROLLED E1, 
       ENROLLED E2, 
       CLASS C1, 
       CLASS C2
 WHERE E1.SNUM = E2.SNUM            -- the same student has enrolled twice
   AND E1.CNAME <> E2.CNAME         -- the enrollments are for difference classes
   AND E1.CNAME = C1.NAME           -- join the class table as C1 for the first enrollment
   AND E2.CNAME = C2.NAME           -- join the class table as C2 for the second enrollment
   AND C1.MEETS_AT = C2.MEETS_AT    -- match the start times for the two enrolled classes

出于兴趣,ANSI SQL的等价物是:

    select E1.SNUM
      from ENROLLED E1 
inner join ENROLLED E2 on E1.SNUM = E2.SNUM
inner join CLASS C1 on E1.CNAME = C1.NAME
inner join CLASS C2 on E2.CNAME = C2.NAME
     where E1.CNAME <> E2.CNAME
       and C1.MEETS_AT = C2.MEETS_AT

和Siyual一样,我更喜欢ANSI版本,但如果你们大学的教学方式是旧的,我建议你们现在就坚持。它同样有效,很多人仍在使用它。一旦你理解了这些概念,你就可以选择你的偏好了。

靳涵亮
2023-03-14

表被声明两次的原因是为了比较同一查询中的表。

您必须有两个表的副本才能将表与自身进行比较。

您的查询正在查看E1,并将其与E2进行对比,其中StudentNumber相同,但类名不同。

然后它查看C1表和C2表,找到类的名称。。。然后看看全班同学是否在同一地点见面。

需要两个表的原因是不能在同一个查询中对E1进行两次比较。无法在单个查询中对照同一列的其他行检查行1。

 类似资料:
  • 我正在检查Angular Bootstrap UI,特别是服务并注意到一件有趣的事情。 在他们的示例中,'http://plnkr.co/edit/e5xykpqwytsljua6fxwt?p=preview',在附加到弹出窗口的控制器中,他们将选定的项包含到另一个内部属性中 为什么需要这个?JavaScript找到了什么? THX

  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使

  • 我在这里(有点)了解jdk 5 Reentry antLock的功能 但为什么我们想要一个“再进入者”锁呢?i、 e如果一个线程已经锁定了一个对象,为什么它需要再次获取它?

  • 问题内容: 我的问题就像标题说的那样:为什么我们需要9个补丁的图像?他们真的那么重要吗?其实,他们真正在做什么?我没有清楚地了解9色块图像的概念。 我知道9补丁图像是可伸缩的。因此,假设我有一些完全适合我的ldpi设备的图像按钮。使用Draw 9-patch工具(android SDK的一部分),我可以标记可缩放区域,并且该图像非常适合hdpi甚至xhdpi设备。边缘会很光滑。 但这真的是很好的实

  • 问题内容: 如果我们使用ExecutorCompletionService,则可以将一系列任务作为s 提交,并将结果作为进行交互。 但也有在的,它接受一个任务,我们得到的名单,以检索结果。 据我所知,使用一个或多个都不会有任何好处(除了我们避免使用循环,否则我们将不得不对任务进行操作),并且基本上它们是相同的想法,只是稍有不同。 那么,为什么有两种不同的方式提交一系列任务呢?我在性能上正确吗?有没