SQL查询,用于从表中查询计数

时间:2019-01-31 01:48:46

标签: sql oracle

提示是要形成一个SQL查询。

  • 找到参加所有大于4个主题的所有讲座的学生的姓名和ID。

表是

CREATE TABLE CLASS (
    STUDENT_ID INT NOT NULL,
    LECTURE_ID INT NOT NULL
   );


CREATE TABLE STUDENT (
   STUDENT_ID INT NOT NULL,
   STUDENT_NAME VARCHAR(255), 
   PRIMARY KEY (STUDENT_ID)
    )

CREATE TABLE LECTURE (
 LECTURE_ID INT NOT NULL,
 LECTURE_NAME VARCHAR(255),
 ECTS INT,
 PRIMARY KEY (LECTURE_ID)
 )

我想出了这个查询,但这在SQLFIDDLE上似乎不起作用。我是SQL的新手,这个查询对我来说有点麻烦。您将如何查询呢?

SELECT STUD.STUDENT_NAME FROM STUDENT STUD
INNER JOIN CLASS CLS AND LECTURE LEC ON
CLS.STUDENT_ID = STUD.STUDENT_ID
WHERE LEC.CTS > 4

如何解决此查询?

更新

insert into STUDENT values(1, 'wick', 20);
insert into STUDENT values(2, 'Drake', 25);
insert into STUDENT values(3, 'Bake', 42);
insert into STUDENT values(4, 'Man', 5);

insert into LECTURE values(1, 'Math', 6);
insert into LECTURE values(2, 'Prog', 6);
insert into LECTURE values(3, 'Physics', 1);
insert into LECTURE values(4, '4ects', 4);
insert into LECTURE values(5, 'subj', 4);


insert into SCLASS values(1, 3);
insert into SCLASS values(1, 2);
insert into SCLASS values(2, 3);
insert into SCLASS values(3, 1);
insert into SCLASS values(3, 2);
insert into SCLASS values(3, 3);
insert into SCLASS values(4, 4);
insert into SCLASS values(4, 5);

3 个答案:

答案 0 :(得分:1)

以下方法可以完成工作。

它通过生成两个子查询来工作:

  • 一个统计每个用户参加ects大于4的演讲的人数
  • 另一个只计算ects大于4的讲座总数的数字

然后,外部查询过滤出计数达到总数的用户:

SELECT x.student_id, x.student_name
FROM 
    (
        SELECT s.student_id, s.student_name, COUNT(DISTINCT l.lecture_id) cnt
        FROM 
            student s
            INNER JOIN class c    ON c.student_id = s.student_id
            INNER JOIN lecture l ON l.lecture_id = c.lecture_id
        WHERE l.ects > 4
        GROUP BY s.student_id, s.student_name
    ) x 
    CROSS JOIN (SELECT COUNT(*) cnt FROM lecture WHERE ects > 4 ) y
WHERE x.cnt = y.cnt ;

答案 1 :(得分:0)

您可以尝试以下查询。

SELECT distinct
STUD.STUDENT_NAME,
STUD.STUDENT_ID 
FROM STUDENT STUD
INNER JOIN CLASS CLS ON CLS.STUDENT_ID = STUD.STUDENT_ID 
INNER JOIN LECTURE LEC ON LEC.LECTURE_ID=CLS.LECTURE_ID 
where LEC.ECTS > 4 group by STUD.STUDENT_ID,STUD.STUDENT_NAME 
having COUNT(STUD.STUDENT_ID) =(SELECT COUNT(*) FROM LECTURE WHERE ECTS > 4)

答案 2 :(得分:0)

正如GMB在回答中所说的那样:计算所需的选修课,并与每个学生的选修课进行比较。这是编写此类查询的另一种方法。我们通过ECTS> 4将外部课程加入所有讲座。通过分析窗口功能,我们可以同时按两个不同的组(此处为:所有行和学生行)进行汇总。

select *
from student
where (student_id, 0) in -- 0 means no gap between required and taken lectures
(
  select
    student_id,
    count(distinct lecture_id) over () -
    count(distinct lecture_id) over (partition by c.student_id) as gap
  from lecture l
  left join class c using (lecture_id)
  where l.ects > 4
);

演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=74371314913565243863c225847eb044