SQL-запрос для запроса подсчета из таблицы - PullRequest
0 голосов
/ 31 января 2019

Подсказка заключается в формировании запроса SQL.

  • Он находит имя и идентификационный номер студента, посещающего все лекции с количеством выступлений более 4.

Таблицы

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 голосов
/ 31 января 2019

Следующий подход может выполнить работу.

Он работает, генерируя два подзапроса:

  • один, который подсчитывает, сколько лекций, чье 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 ;
0 голосов
/ 31 января 2019

Как уже сказал 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

0 голосов
/ 31 января 2019

Вы можете попробовать следующий запрос.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...