【问题标题】:SQL IN statement with multiple conditions and 3 tables具有多个条件和 3 个表的 SQL IN 语句
【发布时间】:2021-09-25 00:55:33
【问题描述】:

我刚刚学习了 SQL 中的 IN 和 NOT IN 语句。我理解这样的陈述

SELECT * FROM table1 WHERE table1.attribute IN
(SELECT table2.attribute FROM table2 WHERE attribute = condition);

我的问题是我需要使用 IN (SELECT) 语句显示 3 列(来自两个不同的表),其中第三个表的条件仅来自第三个表,另一个条件来自前两个表之一。

示例: 显示名称(表 1)、班级(表 1)、课程(表 2),其中课程 LIKE “cosc%”(表 2)和成绩 = 'b'(表 3)。我需要使用 IN 语句。

我的尝试:

SELECT stud.sname, stud.class, sec.course_num FROM stud, sec
WHERE sec.course_num LIKE 'COSC%'
AND stud.stno IN
(SELECT gr.student_number FROM gr WHERE gr.grade = 'B');

Table3 与 table1 和 table2 共享一个域。此查询导致行数过多,其中一张表中只有 48 行。我知道怎么做所有的 JOIN 语句,我不需要。

【问题讨论】:

  • 请显示每个表的表定义 (CREATE TABLE ...)。包括foreign key 约束以显示表是如何相关的。您在studsec 之间缺少join 标准。这就是结果中有大量行的原因。这会生成一种笛卡尔积/交叉连接。您的stud 表可能引用了sec 表。如果是这样,请在JOINON 子句中使用该引用,或者以您使用的形式在WHERE 子句中使用该引用。 JOIN / ON 更可取,您不太可能忘记join 标准。
  • 每张表只包含一些样本数据,以阐明内容和关系。然后根据具体数据指出您期望的结果。

标签: sql oracle


【解决方案1】:

类似这样,假设stud 指的是sec

SELECT stud.sname, stud.class, sec.course_num
  FROM stud JOIN sec ON stud.sec_id = sec.id
 WHERE sec.course_num LIKE 'COSC%'
   AND stud.stno IN (
           SELECT gr.student_number FROM gr WHERE gr.grade = 'B'
       )
;

可能逻辑需要调整,而其他逻辑缺失。

我们会看到问题何时更新为请求的详细信息。

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 2020-12-13
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多