Jacek
Szajer
Współwłaściciel,
Business
Intelligence
Technologies SC
Temat: Ciekawe (chyba :)) zadanie z SQL-a
Witam wszystkich,Parę dni temu mieliśmy do rozwiązania pewien problem z SQL-a, moim zdaniem trochę nietypowy (przynajmniej na tle codziennego użycia). Poradziliśmy sobie (ostatecznie zadanie okazało się proste), ale jednak zadanie uznałem za wystarczająco ciekawe, aby wrzucić je komuś do "pomyślenia" na poniedziałkowy poranek, a jednocześnie nie mam 100% pewności, że zastosowane przez nas rozwiązanie jest w pełni optymalne - chętnie zobaczę inne pomysły na rozwiązanie (oczywiście powiedzmy, że za 2-3dni przedstawię też uczciwie swoje rozwiązanie).
Co do oczekiwanej optymalności rozwiązania - docelowo tabele z danymi będą liczyć 100k+ rekordów każda, tabela-zapytanie 5-10 rekordów, częstość zapytań - do kliku tysięcy / dzień.
Wprowadzenie:
Mamy 3 tabele z danymi (nazewnictwo i cel biznesowy musiałem zmienić, ale sens zadania pozostaje) + tabela robocza:
- Studenci
- Zajecia
- Przypisania (studentów do poszczególnych zajęć)
- t (tabela robocza z listą studentów, o których pytamy)
Celem zadania jest sprawdzenie, czy występuje już grupa zajęciowa studentów o DOKŁADNIE takim samym składzie (co do 1 osoby) i zwrócenie jej ID (jeśli to dla kogoś istotne można przyjąć uproszczenie, że jest maksymalnie tylko 1 taka grupa), czyli przykładowo mamy:
Zajecia:
Z1
Z2
Z3
Z4
Studenci:
A
B
C
D
Przypisania:
Z1, A
Z1, B
Z2, A
Z2, B
Z2, C
Z3, B
Z4, A
Z4, C
Pytamy o grupę studentów o składzie:
A
B
Oczekiwana odpowiedź:
Z1 (i tylko taka)
Żeby nie trzeba było klepać, tabele do bazy testowej:
--------------------------------------------------------
Jacek Szajer edytował(a) ten post dnia 31.10.11 o godzinie 12:32
create table Zajecia
(SetId int)
create table Studenci
(StudenciId int,
StudenciDesc varchar(100)
)
create table Przypisania
(SetId int,
StudenciId int)
create table t
(StudenciId int)
---------------------
insert into Zajecia(SetID)
values(1)
insert into Zajecia(SetID)
values(2)
insert into Zajecia(SetID)
values(3)
insert into Zajecia(SetID)
values(4)
insert into Studenci(StudenciId)
values(1)
insert into Studenci(StudenciId)
values(2)
insert into Studenci(StudenciId)
values(3)
insert into Studenci(StudenciId)
values(4)
insert into Przypisania(SetId, StudenciId)
values(1,1)
insert into Przypisania(SetId, StudenciId)
values(1,2)
insert into Przypisania(SetId, StudenciId)
values(2,1)
insert into Przypisania(SetId, StudenciId)
values(2,2)
insert into Przypisania(SetId, StudenciId)
values(2,3)
insert into Przypisania(SetId, StudenciId)
values(3,2)
insert into Przypisania(SetId, StudenciId)
values(4,1)
insert into Przypisania(SetId, StudenciId)
values(4,3)
insert into t
values(1)
insert into t
values(2)
select * from Zajecia
select * from Studenci
select * from Przypisania
select * from t
-- oczekiwany wynik: Zajecia.SetID = 1