Запрос генерировать не удалось и не появился на экзамене - PullRequest
0 голосов
/ 11 июля 2019

Допустим, у нас есть таблицы Таблицы учеников, предметов и оценок.

Структура и данные, как показано ниже

CREATE MULTISET TABLE tmp_work_db.student ,FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
     student_id     integer,  
  student_name      varchar(50) 

       )
PRIMARY INDEX  ( student_id );

insert into tmp_work_db.student
values(1,'Tim');
insert into tmp_work_db.student
values(2,'John');
insert into tmp_work_db.student
values(3,'Roy');


CREATE MULTISET TABLE tmp_work_db.subject ,FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
     subject_id     integer,  
  subject_name      varchar(50) 

       )
PRIMARY INDEX  ( subject_id );

insert into tmp_work_db.subject
values(1,'English');
insert into tmp_work_db.subject
values(2,'Maths');
insert into tmp_work_db.subject
values(3,'Hindi');


CREATE MULTISET TABLE tmp_work_db.marks ,FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
     student_id     integer, 
     subject_id     integer,  
     marks      integer 

       )
PRIMARY INDEX  ( student_id,subject_id );


insert into tmp_work_db.marks 
values(1,1,50);
insert into tmp_work_db.marks 
values(1,2,100);
insert into tmp_work_db.marks 
values(1,3,40);

insert into tmp_work_db.marks 
values(2,1,50);
insert into tmp_work_db.marks 
values(2,2,30);

Нам нужно написать запрос, который сгенерирует отчет со студентами, которые потерпели неудачу по определенному предмету и которые не появились по предмету.

Я попробовал ниже запрос, чтобы получить студентов, которые не по определенным предметам

sel student_name,subject_name,marks from tmp_work_db.student st 
inner join
(
sel student_id,subject_id,marks from tmp_work_db.marks where marks < 35
) mrk
on st.student_id=mrk.student_id
inner join tmp_work_db.subject sub
on sub.subject_id=mrk.subject_id;

Я не могу получить студентов, которые не появились по определенным предметам.

1 Ответ

1 голос
/ 11 июля 2019

Если вам нужны имена учеников, у которых нет отметок ни по одному из предметов, тогда вам нужно cross join от student до subject и от left join до marks:

select s.student_name, t.subject_name not_appeared
from student s cross join subject t 
left join marks m 
on m.student_id = s.student_id and m.subject_id = t.subject_id
where m.student_id is null

Для студентов, которые не смогли присоединиться к 3 таблицам и поместить условие marks < 35 в предложение WHERE:

select s.student_name, t.subject_name failed
from student s 
inner join marks m on m.student_id = s.student_id
inner join subject t on m.subject_id = t.subject_id
where m.marks < 35

Вы можете объединить 2 запроса в один:

select  
  s.student_name, t.subject_name,
  case when m.marks is null then 'not appeared' else 'failed' end result
from student s cross join subject t 
left join marks m 
on m.student_id = s.student_id and m.subject_id = t.subject_id
where coalesce(m.marks, 0) < 35
order by s.student_name, t.subject_name

См. Демоверсию .Результаты:

> student_name | not_appeared
> :----------- | :-----------
> John         | Hindi       
> Roy          | English     
> Roy          | Maths       
> Roy          | Hindi       

> student_name | failed
> :----------- | :-----
> John         | Maths 

Для комбинированного запроса:

> student_name | subject_name | result      
> :----------- | :----------- | :-----------
> John         | Hindi        | not appeared
> John         | Maths        | failed      
> Roy          | English      | not appeared
> Roy          | Hindi        | not appeared
> Roy          | Maths        | not appeared
...