zapytania sql

0

Majac w bazie tabele
Dzialy(IdDz, Nazwa Dz)
Pracownicy(Pesel,Nazwisko,IdDz,DataZatr)
Pracuje(IdProjektu,Pesel ,Rola,Wynagrodzenie)
klucz głowny(atrybuty podkreslone) i klucz obcy Pesel
Napisz instrukcje SQL ktora podaje NazwaDz kazdego działu w ktorym jest natrudnionych mniej niz 10 osób

Selec NazwaDz from dzialy
having count (IdDz)<10;

instrukcja sql ktora podaje Nazwisko kazdego pracownika ktory nie pracuje nad projektem o IdProj=19

select p.nazwisko from pracownicy p
join pracuje pr on p.pese=pr.pesel
where pr.Idproj not in 19;

instrukcja sql ktora podaje nazwiska wszystkich najdluzej pracujacych pracownikow

select nazwisko from pracownicy
where DataZatr = (Select MIN(DataZatr) from pracownicy);

instrukcja sql ktora podaje nazwisko kazdego pracownika ktory pracuje w tej samej roli w dwoch roznych projektach

select p.nazwisko from pracownicy p 
join pracuje pr on p.pesel=pr,pesel
where rola ....

i w ostatnim przykladzie nie mam pomysłu . Prosilbym o sprawdzenie czy dobrze wykonalem instrukcje w jezyku sql i pomoc z ostatnim przykladem

1

ad. 1
Brakuje group by

ad. 2

where ma nie poprawną składnie, dotadtkowo łącząc się inner joinem nie dostaniesz pracowników ktorzy nigdy nie pracowali nad projektem, where wykluczy Ci pracowników z projektu 19, ale w sytuacji gdy ktoś pracował nad np. 19 i 1 to też będzie w wynikach. Proponuje left join z waruenkiem na 19 w sprzężeniu, lub not in z podzapytaniem na 19 projekt

ad. 3
ok

ad 4

możesz in:

select nazwisko from pracownicy where pesel in (select pesel from pracje group by pesel,rola having count(*)=2)

lub join

select 
     p.nazwisko 
from 
    pracownicy p 
    join pracuje pr on p.pesel=pr,pesel
group by
 p.pesel
,p.nazwisko
,p.rola
having
 count(*)=2
0

Dziękuję za odpowiedz zatem:
1.

Selec NazwaDz from dzialy
group by NazwaDz
having count (IdDz)<10;
Select p.nazwisko from pracownicy p join pracuje pr on p.pesel = pr.pesel
where pr.IdProj not in (select p.nazwisko from pracownicy where pr.Idproj =19);

Czy jest ok ?

1

ad. 1
Teraz zauważyłem to zapytanie jest złe, bo nie uwzględnia pracowników, czyli właściwie nie liczy pracowników, musisz dodać do niego tabelę praownicy

ad. 2
Nadal źle. nie może tam być inner joina musi być left join. Dodatkow warunek where jest bez sensu bo porównujesz nazwisko z idproj

0

Prosiłbym o sprawdzenie lub o poprawę bo juz nie mam pomysłu na to..

1.
select d.NazwaDz from dzialy d
join pracownicy p on d.IdDz=p.IdDz
group by d.NazwaDz
having count(p.nazwisko)<10;

2.
select p.nazwisko from pracownicy p
left join pracuje pr on p.pesel=pr.pesel
where pr.IdProj not in (select pr.Idproj from pracuje
where pr.IdProj = 19);

1

Pierwsze ok. Drugie przekombinowales


select 
   p.nazwisko
from
   pracownicy p
   left join pracuje pr on p.pesel=pr.pesel 
                                          and pr.idprojektu =19
where 
   pr.IdProj is null
0

czy nie powinno byc:

select 
    p.nazwisko
from
    pracownicy p
    left join pracuje pr on p.pesel=pr.pesel                                          
where 
    pr.IdProj is null and not in pr.idprojektu =19;

?

0

Nie, pomijając że ten where ma nie prawidłową składnię to ta koniunkcja nie ma sensu, skoro idprojektu będzie nullem to nie będzie rowna 19.

Możesz to napisać tak:

select * from pracownic where pesel not in (select pesel from projekty where idprojektu=19)

Wracając do mojego rozwiązania:
sprzężenie: p.pesel=pr.pesel and pr.idprojektu =19 "weźmie" tylko rekordy z pracuje, które mają w idprojektu 19:

Może czytelniej dla zrozumienia będzie tak zapisane:

select 
    p.nazwisko
from
    pracownicy p
    left join (select * 
                 form
                      pracuje 
                  where
                      dprojektu =19) pr on  pr on p.pesel=pr.pesel 
where 
    pr.IdProjektu is null

Bez warunku where zapytanie zwróci pracowników, i rekordy z pracuje które są na projekcie 19, jako że właśnie takich nie chcemy to w where zawężamy do tych które takiego dopasowania nie mają. Teraz to nie ma znaczenia, ale to obejście negacji w warunkach, ponieważ przeczenie w uproszczeniu nie są optymalizowane.
A tak wykluczamy przez porównanie nie przeczenie.

0

Dziekuje a mogłby Pan to dobrze składniowo napisac bo cos mi nie pasuje ...

select 
    p.nazwisko
from
    pracownicy p
    left join (select * 
                 from
                      pracuje 
                  where
                      idprojektu =19) pr on  pr on p.pesel=pr.pesel 
where 
    pr.IdProjektu is null
0

Serio? Panowanie na forum internetowym...

Faktycznie zrobiłem błąd:

select 
    p.nazwisko
from
    pracownicy p
    left join (select * 
                 from
                      pracuje 
                  where
                      idprojektu =19)  pr on p.pesel=pr.pesel 
where 
    pr.IdProjektu is null
0

hmm 2x razy where ? i w ktorym miejscu powinno byc zamkniecie nawiasu ?

1

To jest join z podzapytaniem dlatego where, używając CTE (składnia tsql) aby było "czyściej:

with pr as (
select * 
from
    pracuje 
where
   idprojektu =19
)
select 
    p.nazwisko
from
    pracownicy p
    left join   pr on p.pesel=pr.pesel 
where 
    pr.IdProjektu is null

analogicznie jak z podzapytanie w in też ma 2x where

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