Przecież SELECT id_process FROM task WHERE status = 'completed' GROUP BY id_process; zwróci liste procesów które mają przynajmniej jedno zadanie zakończone, a nie liste procesów, w których wszystkie zadania zostały zakończone. Nie widzisz tego?
Cały problem leży w tym, żeby uzyskać listę procesów, w których wszystkie zadania się zakończyły, użycie WHERE w tym przypadku nic nie da, bo przed wykonaniem funkcji COUNT ograniczy zbiór poczatkowy do zadań które się nie zakończyły (w przypadku WHERE status <> 'completed') albo do zadań które się zakończyły w przypadku WHERE status = 'completed'). Czyli używając WHERE status = 'completed' nie wiemy czy są w tak ograniczonej tabeli rekordy z status <> 'completed'
Na przykładzie będzie prościej. Przyjmijmy, że w tabela "task" wygląda tak (pominąłem pierwsze pole bo jest nieistotne w tym wypadki):
No tak – mają być wszystkie. Wobec tego biję się w piersi, rzeczywiście moje zapytanie nie daje poprawnego wyniku.
Mimo wszystko napisałbym to inaczej:
SELECT id_process
FROM task
WHERE status = 'completed'
GROUP BY id_process
EXCEPT
SELECT id_process
FROM task
WHERE status <> 'completed'
GROUP BY id_process
To zapytanie wciąż będzie szybsze w planie wykonania od Twojego.
… reply
Nie jestem do końca przekonany, czy będzie szybsze. Nawet jeżeli tak, to najprawdopodobniej
SELECT DISTINCT id_process AS p1 FROM task
WHERE status = 'completed' AND
NOT EXISTS (SELECT * FROM task WHERE status <> 'completed' AND id_process = p1);
będzie jeszcze szybsze. Ale to nie o to chodzi.
… reply
Tomasz Trojanowski mieszka w Łańcucie, wraz z żoną Iwoną i synami Jakubem i Arkadiuszem. Pracuje jako administrator serwerów internetowych. W wolnych chwilach zajmuje się projektem PLD/FreeBSD.