Witam wszystkich,
przygodę z bazami zacząłem dość niedawno, dziś chcę prosić o pomoc w napisaniu pewnego zapytania.
Moja baza danych składa się z czterech tabel: Kobiet, Mężczyzn, CechPoszukiwanych (przez kobiety) oraz CechMężczyzn.
Struktura wygląda nastepująco:
create table Kobiety
(
IdKobiety int not null primary key identity (1, 1),
Nazwisko varchar(30) not null
);
GO
create table Mezczyzni
(
IdMezczyzny int not null primary key identity (1, 1),
Nazwisko varchar(30) not null
);
GO
create table CechyPoszukiwane
(
IdCechyPosz int not null primary key identity (1, 1),
IdKobiety int not null,
Cecha varchar(20) not null
);
GO
create table CechyMezczyzny
(
IdCechyM int not null primary key identity (1, 1),
IdMezczyzny int not null,
Cecha varchar(20) not null
);
GO
alter table CechyPoszukiwane
add constraint fk_cPosz_K foreign key (IdKobiety) references Kobiety(IdKobiety);
GO
alter table CechyMezczyzny
add constraint fk_cechyM_M foreign key (IdMezczyzny) references Mezczyzni(IdMezczyzny);
Chcę dla każdej kobiety wybrać mężczyznę, który posiada najwięcej cech poszukiwanych przez daną kobietę. Kombinowałem na przeróżne sposoby, jednak nie udało mi się wydostać tej informacji. Ostatnia moja próba wyglądała tak:
select k.Nazwisko, m.Nazwisko, cp.Cecha
from Kobiety k left join CechyPoszukiwane cp on k.IdKobiety = cp.IdKobiety
join CechyMezczyzny cm on cp.Cecha = cm.Cecha
join Mezczyzni m on cm.IdMezczyzny = m.IdMezczyzny
group by k.IdKobiety, k.Nazwisko, m.Nazwisko, cp.Cecha
having COUNT(cp.Cecha) =
(
select MAX(result.ile) from
(
-- Ile wspolnych cech ma kazda kobieta z kazdym mezczyzna
select k.Nazwisko, count(cm.Cecha) ile
from Kobiety k join CechyPoszukiwane cp on k.IdKobiety = cp.IdKobiety
join CechyMezczyzny cm on cp.Cecha = cm.Cecha
join Mezczyzni m on cm.IdMezczyzny = m.IdMezczyzny
group by k.Nazwisko, cm.Cecha
/*select k.Nazwisko, m.Nazwisko, cm.Cecha, COUNT(cp.Cecha) as ile
from CechyPoszukiwane cp join CechyMezczyzny cm on cp.Cecha = cm.Cecha
join Mezczyzni m on cm.IdMezczyzny = m.IdMezczyzny
join Kobiety k on cp.IdKobiety = k.IdKobiety
where k.IdKobiety = cp.IdKobiety and cp.Cecha = cm.Cecha
group by cm.IdMezczyzny, m.Nazwisko, cm.Cecha, k.Nazwisko*/
) result
);
Próbowałem też wybrać cechy, których poszukuje każda z kobiet i porównywać z cechami mężczyzn, ale nie wiem, czy to możliwe, nie udało mi się i nie wiem jak to zrobić. Dlatego proszę o wskazówki/sugestie, coś, co mogłoby mnie jakoś naprowadzić.