Próbuję utworzyć zapytanie zwracające wszystkie wiersze bez powtórzeń z tabeli Pracownicy z warunkiem IdCechy =
Liczba wierszy w tabelach wyniesi > 500 tys. więc wydajność zapytania również jest ważna.
Bardzo proszę o pomoc.
Skoro IdPracownika to klucz główny i (IdPracownika,IdCechy) to klucz główny to zwykłe złaczenie da ci na pewno unikalny zbiór wyników.
select IdPracownika, Imie from Pracownicy inner join PracownicyCechy on Pracownicy.IdPracownika = PracownicyCechy.IdPracownika and PracownicyCechy.IdCechy = liczba
Dzięki @Shalom, ale zapomniałem dopisać, że bardzo zależy mi na zapytaniu, gdzie IdCechy będzie określany w warunku Where, a nie w złączeniu.
Zamień AND
na WHERE
.
Ok
SELECT Pracownicy.IdPracownika, Pracownicy.Imie, PracownicyCechy.IdCechy
FROM Pracownicy INNER JOIN PracownicyCechy
ON Pracownicy.IdPracownika = PracownicyCechy.IdPracownika
Where PracownicyCechy.IdCechy = 1
działa prawidłowo.
Jeszcze jedno pytanie.
W jaki sposób pozbyć się powtórzeń w kolumnie IdPracownika (uzyskać wszystkich pracowników bez powtórzeń) z zapytania:
SELECT Pracownicy.IdPracownika, Pracownicy.Imie, PracownicyCechy.IdCechy
FROM Pracownicy INNER JOIN PracownicyCechy
ON Pracownicy.IdPracownika = PracownicyCechy.IdPracownika
Nie da się bo nie miałoby to sensu. Skoro pracownik może mieć więcej niż 1 cechę to siłą rzeczy nie możesz tego zrobić. No bo chcesz wynik w 3 kolumnach i jak chcesz tam pomieścić id, imie i 100 cech? Możesz pokazać jakby miał wyglądać wynik takiego zapytania?
W wyniku chcę zwrócić wszystkie wiersze bez powtórzeń z tabeli Pracownicy, gdzie
Pracownicy.IdCechy =
Warunek konieczny dla zapytania:
- wykorzystanie warunku do całego zapytania:
Where Pracownicy.IdCechy =
Jeśli dany Pracownik ma przypisany wiele cech to w wyniku ma być zwracany jeden wiersz z tabeli Pracownicy z dowolną cechą np. pierwsza lub ostatnia
IdPracownika | Imie | IdCechy
1 | Jan | 1
1 | Jan | 2
1 | Jan | 5
2 | Tomasz | 1
3 | Szymon | 3
3 | Szymon | 6
Tabela wynikowa dla warunku:
Where Pracownicy.IdCechy = 1 OR Pracownicy.IdCechy = 3
IdPracownika | Imie | IdCechy
1 | Jan | 1
2 | Tomasz | 1
3 | Szymon | 3
SELECT * FROM pracownicy WHERE IdPracownika IN(SELECT idPracownika FROM PracownicyCechy WHERE idCechy IN(3,6))
albo
SELECT * FROM pracownicy p JOIN (SELECT idPracownika, Min(IdCechy) IdCechy FROM PracownicyCechy WHERE idCechy IN(3,6) GROUP BY 1) x ON x.IdPracownika=p.IdPracownika