Zapytanie zwracające listę dydaktyków, którzy nie wystawili żadnej oceny

0

Witam! Mam problem z dosyć prostym zapytaniem. Ogólnie rzecz biorąc mam wyświetlić imiona i nazwiska dydaktyków, którzy nie wystawili żadnej oceny. Dziwi mnie to, iż moje zapytanie wyświetla mi listę dydaktyków, którzy wystawili oceny, gdy zmienię NOT EXISTS na EXISTS. Próbowałem to zadanie wykonać przy pomocy IS NULL, aczkolwiek efekt był identyczny.
W załączniku umieściłem schemat do bazy.

SELECT o.IdOsoba, o.Imie, o.Nazwisko, COUNT(oc.ocena) 'Ile Ocen' FROM Osoba o, Dydaktyk d, Ocena oc
WHERE o.idOsoba = d.idOsoba AND d.IdOsoba = oc.IdDydaktyk
	AND	NOT EXISTS
		(
			SELECT z.Ocena FROM Osoba x, Dydaktyk y, Ocena z
			WHERE d.IdOsoba = y.IdOsoba AND y.IdOsoba = z.IdDydaktyk
		)
GROUP BY o.IdOsoba, o.Imie, o.Nazwisko;

Także, byłbym wdzięczny jakby ktoś wytknął mi błąd lub lukę w moim rozumowaniu.
Z góry dzięki!

P.S. Niestety, nie mogę korzystać z T-SQLa.

0

Jak robisz SELECT … FROM a, b, c to na wyjściu masz CROSS JOIN, który potem filtrujesz przy pomocy WHERE. Lepiej użyć od razu INNER JOIN

Ja bym to zrobił tak:

SELECT
  o.IdOsoba,
  o.Imie,
  o.Nazwisko,
  COUNT(oc.ocena) AS IleOcen
FROM
  Osoba o
INNER JOIN Dydaktyk AS d
  ON o.idOsoba = d.idOsoba
WHERE
  NOT EXISTS (
    SELECT *
    FROM Ocena AS o
    WHERE d.IdOsoba = o.IdDydaktyk
  )
GROUP BY o.IdOsoba, o.Imie, o.Nazwisko
0

Skoro liczysz ilość ocen, to po co Ci exists?

SELECT 
	o.IdOsoba
	, o.Imie
	, o.Nazwisko
FROM 
	Dydaktyk d
	inner join Osoba o on o.idOsoba = d.idOsoba
	left join Ocena oc on d.IdOsoba = oc.IdDydaktyk
GROUP BY 
	o.IdOsoba
	, o.Imie
	, o.Nazwisko
HAVING
	SUM(CASE WHEN OC.iDdYDAKTYK IS NULL THEN 0 ELSE 1 END) = 0
0

Myślałem, iż zadziała, ponieważ jeśli nie wyświetlałoby ocen, to wynikiem COUNT byłoby NULL mojego podzapytania (w końcu nie wartość 0, a po prostu brak wierszy). Później dopiero spróbowałem z EXISTS.

Tak czy siak, dzięki za rozwiązanie! : D

2

COUNT nigdy nie zwróci null co najwyżej 0, ja też przekombinowałem bo można tak:

SELECT 
    o.IdOsoba
    , o.Imie
    , o.Nazwisko
FROM 
    Dydaktyk d
    INNER JOIN Osoba o ON o.idOsoba = d.idOsoba
    LEFT JOIN Ocena oc ON d.IdOsoba = oc.IdDydaktyk
GROUP BY 
    o.IdOsoba
    , o.Imie
    , o.Nazwisko
HAVING
    COUNT(OC.iDdYDAKTYK) = 0

count zlicza wartości <> null więc dla dydaktyków bez oceny będzie równe 0

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