witam mam dwie tabele zu pracownikami i uprawnieniami pracownikow potrzebuje zwrucic imie i nazwisko pracownika posadajacego uprawnienie a "I" b a lub b dziala
ale polaczenie nie smiga:/ mam takie cos "SELECT [ID_pracownika], [Imię], [Nazwisko] FROM Pracownicy WHERE [ID_pracownika] IN (SELECT [ID pracownika] FROM Uprawnienia WHERE [Nazwa Uprawnienia] != '" + checkedListBox1.CheckedItems[0].ToString() + "' AND (SELECT [Nazwa Uprawnienia] FROM Uprawnienia WHERE [Nazwa Uprawnienia] = '" + checkedListBox1.CheckedItems[1].ToString() + "')) ;";
macie jakis pomysl na sprytne rozwiazanie problemu
Mogłeś usunąć te zbędne (dla nas) odwołania do listboxa bo tylko zaciemniają sytuację.
Jak wygląda ta tabela uprawnienia? IdPracownika występuje w niej kilka razy? Czy jeśli wystąpi 2 razy to znaczy ze już spełnia warunek (bo ma 2 różne uprawienienia?) To mozna by to zrobić tak:
SELECT Imie, Nazwisko
FROM Pracownicy
WHERE IdPracownika in (
SELECT IdPracownika
FROM Uprawnienia
GROUP BY IdPracownika
HAVING Count(IdPracownika)=2 )
Albo zrobić np. w tym podzapytaniu self join i warunek zlączenia :
(Uprawnienia1.IdPracownika = Uprawnienia2.IdPracownika) AND (Uprawnienia1.Nazwa <> Uprawnienia2.Nazwa)
myslalem wlasnie o HAVING w tym zapytaniu ktore napisales byloby git zwruci mi pracownikow ktorzy maja 2 uprawnienia ale teraz chodzi mi zeby mieli konkretne 2 uprawnienia bo moga miec 2 zupelnie inne uprawnienia
tabela uprawnienia:
ID pracownika | nazwa uprawnienia | reszta nieistotna:)
0 a
0 b
0 c
1 d
1 a
Pracownicy
ID pracownika | Imie | Nazwisko | reszta nieistotna:)
0 ddd ddd
1 aaa aaa
No to ja bym tam wrzucił po prostu takiego zabawnego joina (pewnie da się łatwiej ;) ):
SELECT Imie, Nazwisko
FROM Pracownicy
WHERE IdPracownika in (
SELECT U1.IdPracownika
FROM Uprawnienia as U1 inner join Uprawienia as U2
ON (U1.IdPracownika = U2.IdPracownika) AND (U1.Nazwa ="A") AND (U2.Nazwa = "B")
)
(mogą być błędy bo pisane z palca)
select =" SELECT [Imię], [Nazwisko] "+
"FROM Pracownicy "+
"WHERE [ID_pracownika] IN ("+
"SELECT U1.ID_pracownika "+
"FROM Uprawnienia AS U1 INNER JOIN Uprawienia AS U2"+
" ON (U1.ID_pracownika = U2.ID_pracownika) AND (U1.[Nazwa uprawnienia] ='" + checkedListBox1.Items[0].ToString() + "') AND (U2.[Nazwa uprawnienia] = '" + checkedListBox1.Items[1].ToString() + "'))";
bład skłądniowy mi wywala i nie moge znalezc gdzie on ma problem:/
select =" SELECT [Imię], [Nazwisko] "+
"FROM Pracownicy "+
"WHERE [ID_pracownika] IN ("+
"SELECT U1.ID_pracownika "+
"FROM Uprawnienia AS U1 INNER JOIN Uprawnienia AS U2"+
" ON (U1.ID_pracownika = U2.ID_pracownika) AND ((U1.[Nazwa uprawnienia] ='" + checkedListBox1.Items[0].ToString() + "') AND (U2.[Nazwa uprawnienia] = '" + checkedListBox1.Items[1].ToString() + "')))";
dobra udalo mi sie wszystko dziala::)
a jeszcze pytanie czy dla 3,4 itd nazw uprawnien ktore bedzie musial pracownik spelniac zasada moze byc taka sama
tzn:
select = " SELECT [Imię], [Nazwisko] " +
"FROM Pracownicy " +
"WHERE [ID_pracownika] IN (" +
"SELECT U1.ID_pracownika " +
"FROM Uprawnienia AS U1 INNER JOIN Uprawnienia AS U2 INNER JOIN Uprawnienia AS U3" +
" ON (U1.ID_pracownika = U2.ID_pracownika) AND (U1.[Nazwa uprawnienia] ='" + checkedListBox1.CheckedItems[0].ToString() + "') AND ((U2.[Nazwa uprawnienia] = '" + checkedListBox1.CheckedItems[1].ToString() + "') AND (U3.[Nazwa uprawnienia] = '" + checkedListBox1.CheckedItems[2].ToString() + "')))";
bo to mi nie dziala:/
Nie. Naucz się może troche tego SQL? Po joinie musisz mieć warunek złączenia...
Zasada może być taka sama ale to musi mieć ręce i nogi
SELECT Imie, Nazwisko
FROM Pracownicy
WHERE IdPracownika in (
SELECT U1.IdPracownika
FROM Uprawnienia as U1 inner join Uprawienia as U2
ON (U1.IdPracownika = U2.IdPracownika) AND (U1.Nazwa ="A") AND (U2.Nazwa = "B")
inner join Uprawnienia as U3
ON (U1.IdPracownika = U3.IdPracownika) AND (U3.Nazwa = "C")
)
Ale to jest w ogóle średnie rozwiazanie i na bank jest lepsze, pomyśl nad tym.
przez caly czas wywala mi blad skladnowy
select = " SELECT [ID_pracownika], [Imię], [Nazwisko], [Dział], [Stanowisko] " +
"FROM Pracownicy " +
"WHERE [ID_pracownika] IN (" +
"SELECT U1.ID_pracownika " +
"FROM Uprawnienia AS U1 INNER JOIN Uprawnienia AS U2" +
" ON (U1.ID_pracownika = U2.ID_pracownika) AND ((U1.[Nazwa_uprawnienia] ='" + checkedListBox1.CheckedItems[0].ToString() + "') AND (U2.[Nazwa_uprawnienia] = '" + checkedListBox1.CheckedItems[1].ToString() + "')) " +
" INNER JOIN Uprawnienia AS U3 " +
"ON (U2.ID_pracownika = U3.ID_pracownika) AND (U3.[Nazwa_uprawnienia] = '" + checkedListBox1.CheckedItems[2].ToString() + "'))";
moze ktos podpowiedziec gdzie?
Czy nie lepiej napisać procedurę do tego , zawracającą potrzebne dane , w niej można zawrzeć klika reguł i gotowe.
procedure jestem poczatkujacy jesli chodzi o SQL mozesz podac przyklad jakby to mialo wygladaC?