【问题标题】:SQL query to check if some entry contains list of values and compare themSQL查询检查某些条目是否包含值列表并比较它们
【发布时间】:2022-01-31 02:34:25
【问题描述】:

我有两个具有以下架构的 MySql 表

Courses(CNO:CHAR(10),CName:VARCHAR(50), DeptId:CHAR(3)): Each course is given a
unique ID called CNO
Register(RNO:CHAR(10), CNO:CHAR(10), Year:INTEGER, Sem:INTEGER, Grade:CHAR)

现在的任务是找到所有符合 (r1,r2,d) 的元组,使得该学生的卷号为 no。 r1 已经完成了具有 DeptId ID 的部门的所有课程,该学生的卷号。 r2 已经完成了。

我的方法是首先找到学生r2完成的该部门的所有课程,然后找到学生r1在该部门完成的所有课程并比较它们是否相同,但我不知道是否会正确以及如何比较两个结果 这是我检查学生 r2 在特定部门完成的所有课程的代码

这里是代码和数据的链接DB Fiddle

【问题讨论】:

  • 我不知道它是否正确' - 你可以用铅笔和一点纸检查 - 或者你的意思是正确的?
  • @P.Salmon 通常这是正确的,我问是否会有任何极端情况。另外如何比较两个查询的结果。我找到了这个stackoverflow.com/questions/5727882/… 之一,但我无法理解如何将上面 DB Fiddle 链接中给出的 sql 查询存储到一些适当的缩进方式以避免混乱。
  • '在上面的 DB Fiddle 链接中给出的 sql 查询链接到一些适当的缩进方式以避免混乱'使用 dbfiddle.uk 代替

标签: mysql sql


【解决方案1】:

这是我的方法

第 1 步: 创建一个包含两列的表,student1 和 student2 以及学生的唯一组合

例如

RNO1 RNO2
1    2
1    3
2    3

第 2 步: 创建一个表,该表还为 RNO1 和 RNO2 的每个不同 DeptId 将唯一 DeptId 添加到前一个表

例如

RNO1 RNO2 DeptId
1    2    IME
1    2    CHE
1    2    ECO
1    3    IME
1    3    CHE
2    3    ECO

第 3 步: 最后,只保留 RNO1 和 RNO2 都为每个 DeptId 上过相同课程的元组。

这里是一个例子,其中rno1_rno2_deptid指的是上表

SELECT
   *
FROM
   rno1_rno2_deptid as d
WHERE
   NOT EXISTS((SELECT DISTINCT CNO FROM Register AS r WHERE r.RNO = d.RNO1 AND r.DeptId = d.DeptId) 
   MINUS 
   (SELECT DISTINCT CNO FROM Register AS r WHERE r.RNO = d.RNO2 AND r.DeptId = d.DeptId))

以上仅选择了RNO1和RNO2在同一部门具有相同CNO的情况。

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2020-07-17
    • 1970-01-01
    • 2022-11-10
    • 2020-10-08
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多