Обнаружение проблемы при создании списка всех студентов, которые принадлежат к мажору, названному «CS», но не к майору, названному «EE» - PullRequest
0 голосов
/ 20 апреля 2020
S_id int Primary Key,
S_name varchar(100),
Gpa float ,
Size_hs int 
)

Create  table Apply (
s_id int ,
C_name varchar(100),
Major varchar(10),
Decision varchar(2)
)


insert into Students values (123,'Amy',3.9,1000)
insert into Students values (234,'Bob',3.6,1500)
insert into Students values (345,'Craig',3.5,500)
insert into Students values (456,'Doug',3.9,1000)
insert into Students values (567,'Edward',2.9,2000)
insert into Students values (678,'Fay',3.8,200)
insert into Students values (789,'Gray',3.4,800)
insert into Students values (987,'Helen',3.7,800)
insert into Students values (876,'Irene',3.9,400)
insert into Students values (765,'Jay',2.9,1500)
insert into Students values (654,'Amy',3.9,1000)
insert into Students values (543,'Craig',3.4,2000)


insert into Apply values (123,'NJIT','CS','Y')
insert into Apply values (123,'NJIT','EE','N')
insert into Apply values (123,'Stoony Brook','CS','Y')
insert into Apply values (123,'Cornell','EE','Y')
insert into Apply values (234,'Stoony Brook','Bio','N')
insert into Apply values (345,'WPI','Bio-Eng','Y')
insert into Apply values (345,'Cornell','Bio-Eng','N')
insert into Apply values (345,'Cornell','CS','Y')
insert into Apply values (345,'Cornell','EE','N')
insert into Apply values (678,'NJIT','Hist','Y')
insert into Apply values (987,'NJIT','CS','Y')
insert into Apply values (987,'Stoony Brook','CS','Y')
insert into Apply values (876,'NJIT','Bio','N')
insert into Apply values (876,'WPI','Marine-Bio','Y')
insert into Apply values (876,'WPI','Hist','N')
insert into Apply values (765,'NJIT','Hist','Y')
insert into Apply values (765,'Cornell','Hist','N')
insert into Apply values (765,'Cornell','Psych','Y')
insert into Apply values (543,'WPI','CS','N')

Создать таблицу учеников (S_id int Первичный ключ, S_name varchar (100), Gpa float, Size_hs int)

Создать таблицу Apply (s_id int, C_name varchar (100), Major varchar (10) ), Решение varchar (2))

вставить в значения учеников (123, 'Amy', 3.9,1000) вставить в значения учеников (234, 'Bob', 3.6,1500) вставить в значения учеников (345 , 'Craig', 3,5500) вставить в значения учеников (456, 'Doug', 3.9,1000) вставить в значения учеников (567, 'Edward', 2.9,2000) вставить в значения учеников (678, 'Fay', 3.8,200) вставить в значения для студентов (789, «Серый», 3,4,800) вставить в значения для студентов (987, «Елена», 3,7,800) вставить в значения для студентов (876, «Ирина», 3,9,400) вставить в значения учеников (765, «Jay», 2.9,1500) вставьте в значения учеников (654, ​​«Эми», 3.9,1000) вставьте в значения учеников (543, «Крейг», 3.4,2000)

вставить в значения Apply (123, 'NJIT', 'CS', 'Y') вставить в значения Apply (123, 'NJIT', 'EE', 'N') вставить в значения Apply (123, 'Stoony Brook', 'CS', 'Y') вставить в Apply va вставка значений (123, «Корнелл», «EE», «Y») в значения «Применить» (234, «Стоуни-Брук», «Био», «N») в значения «Применить» (345, «WPI», «Био- Eng ',' Y ') вставить в Apply значения (345,' Cornell ',' Bio-Eng ',' N ') вставить в Apply значения (345,' Cornell ',' CS ',' Y ') вставить в Apply значения (345, «Корнелл», «EE», «N») вставляются в значения «Применить» (678, «NJIT», «Hist», «Y»), вставляются в значения «Применить» (987, «NJIT», «CS», 'Y') вставить в значения Apply (987, 'Stoony Brook', 'CS', 'Y') вставить в значения Apply (876, 'NJIT', 'Bio', 'N') вставить в значения Apply (876, Вставка 'WPI', 'Marine-Bio', 'Y') в значения Apply (876, 'WPI', 'Hist', 'N') вставка в значения Apply (765, 'NJIT', 'Hist', 'Y ') вставить в значения Apply (765,' Cornell ',' Hist ',' N ') вставить в значения Apply (765,' Cornell ',' Psych ',' Y ') вставить в значения Apply (543,' WPI ' , 'CS', 'N')

По сути, мне нужно найти список студентов, которые принадлежат к мажору, названному «Cs», но не к мажору «EE». Я попробовал это сам, но он не работает должным образом. Вот код ниже:

select * from students
where s_id in (
  select s_id 
  from apply
  where major='CS' and Major!='EE'
  group by s_id
)```

1 Ответ

0 голосов
/ 20 апреля 2020

Я бы использовал exists и not exists:

select s.* 
from students s
where 
    exists (select 1 from applies a where a.s_id = s._id  and a.major = 'CS')
    and not exists (select 1 from applies a where a.s_id = s._id  and a.major = 'EE')

При индексе applies(s_id, major) это должно быть эффективным вариантом.

Другой подход - присоединиться, агрегировать и фильтровать с предложением having. Для этого требуется перечислить столбцы, которые вы хотите отобразить в предложениях select и group by:

select s.s_id, s.s_name
from students s
inner join applies a on a.s_id = s.s_id
where a.major in ('CS', 'EE')
group by s.s_id, s.s_name
having 
    max(case when a.major = 'CS' then 1 else 0 end) = 1
    and max(case when a.major = 'EE' then 1 else 0 end) = 0

Примечание: apply - зарезервированное слово в числе баз данных (SQL Serer , Oracle, ...), следовательно, не очень хороший выбор для имени таблицы. Я переименовал его в applies в запросах.

...