Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как написать такай запрос! Help  [new]
dmipro
Member

Откуда:
Сообщений: 2
Подскажите пож. каким образом строится данный запрос или хоты бы принцып....

Есть две таблицы
1-я DISCIPLINE (Дисциплина)
Столбцы:
ID (Уникальный код дисциплины)
Name (Название дисциплины)
СourseID (Код курса к которому относится данная дисциплина, т.е. в курсе несколько дисциплин)
Это внешний ключ к таблице COURSE(Курс)

2-я STUDENS_DISCIPLINE (Суденты сдающие дисциплины)
Столбцы:
StudentsID (Код студента, это внешний ключ)
DisciplineID (Код дисциплины,это внешний ключ от DISCIPLINE )

Т.е. запись в этой табл показывает что студент сдал эту дисциплину

Необходим запрос,
котрый выдавал бы два столбца
СourseID и StudentsID,
в котором былибы только те студенты которые сдали ВСЕ дисциплины по данному курсу.
8 окт 05, 14:39    [1951081]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такай запрос! Help  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Выбрать "курсы" * "студенты" где нет "дисциплина", не связанной с "курсы" и со "студенты".

select ...
from курсы
cross join студенты
where not exists
(select 1 from дисциплины
where not exists(select 1 from студенты_дисциплины
where ...
))
8 окт 05, 14:52    [1951110]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такай запрос! Help  [new]
dmipro
Member

Откуда:
Сообщений: 2
Все равно не понял какое должно быть продолжение.
Ведь во внутреннем запросе должна быть ссылка на внешний ....

(select 1 from дисциплины
where not exists
(select 1 from студенты_дисциплины
where ...
))
12 окт 05, 15:34    [1962367]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такай запрос! Help  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
SELECT t1.Id as StudentsId, t2.CourseId
FROM Students t1
CROSS JOIN Discipline t2
LEFT JOIN Students_Discipline t3 on t3.StudentsId=t1.Id and t3.DisciplineId=t2.Id
GROUP BY t1.Id,t2.CourseId
HAVING COUNT(*)=COUNT(t3.DisciplineId)
ORDER BY t1.Id,t2.CourseId
12 окт 05, 16:50    [1962778]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такай запрос! Help  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
у меня есть ещё вариант
declare @COURSE table(id int identity(1,1),СourseD int)
declare @DISCIPLINE table(id int identity(1,1),name varchar(10),СourseID int)
declare @STUDENS_DISCIPLINE  table(StudentsID int	,DisciplineID int)
declare @STUDENS  table (id int identity(1,1),name varchar(10),СourseID int)
insert into @COURSE
 select 1 union select 2
insert into @DISCIPLINE
 select 'd1',1 union all
 select 'd2',1 union all
 select 'd3',1 union all
 select 'd4',2 union all
 select 'd5',2
insert into @STUDENS
 select 'вася',1 union all 
 select 'женя',1 union all 
 select 'петя',2 union all 
 select 'маша',2 union all 
 select 'dmipro',2
insert into @STUDENS_DISCIPLINE
select 1,1 union all
select 1,2 union all 
select 2,1 union all 
select 2,2 union all 
select 2,3 union all 
select 3,4 union all 
select 4,4 union all 
select 4,5

select tc.id СourseID,ts.id StudentsID,
 case when count(tsd.DisciplineID)=count(td.id) then ts.name+' всё сдал(а)'
      when sum(case when tsd.StudentsID is null then 1 else 0 end)=count(td.id) then ts.name+' не сдал ничего'
      else ts.name+' - надо досдать '+cast(sum(case when tsd.StudentsID is null then 1 else 0 end) as varchar)+' дисциплину' 
 end
from @COURSE tc
 join @STUDENS ts on tc.id=ts.СourseID
  join @DISCIPLINE td on tc.id=td.СourseID
   left join @STUDENS_DISCIPLINE tsd on ts.id=tsd.StudentsID and td.id=tsd.DisciplineID
 group by tc.id ,ts.id,ts.name
12 окт 05, 17:06    [1962862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить