teoretycznie proste zapytanie

0

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

0

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)
0

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

0

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)

0
 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:/

0
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::)

0

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:/

0

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.

0

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?

0

Czy nie lepiej napisać procedurę do tego , zawracającą potrzebne dane , w niej można zawrzeć klika reguł i gotowe.

0

procedure jestem poczatkujacy jesli chodzi o SQL mozesz podac przyklad jakby to mialo wygladaC?

1 użytkowników online, w tym zalogowanych: 0, gości: 1