SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Od Postgres 9.1 klucz podstawowy obejmuje wszystkie kolumny tabeli w GROUP BY klauzula. W starszych wersjach musiałbyś dodać a.limit_call do GROUP BY lista. Informacje o wersji 9.1:
Zezwól na inne niż GROUP BY kolumny na liście celów zapytania, gdy klucz podstawowy jest określony w GROUP BY klauzula
Dalsza lektura:
- Dlaczego nie mogę wykluczyć kolumn zależnych z `GROUP BY` podczas agregacji według klucza?
Warunek, który miałeś w WHERE klauzula musi zostać przeniesiona do HAVING klauzula, ponieważ odnosi się do wyniku funkcji agregującej (po WHERE został zastosowany). I nie możesz odwoływać się do kolumn wyjściowych (aliasy kolumn) w HAVING klauzula, w której można odwoływać się tylko do kolumn wejściowych. Więc musisz powtórzyć wyrażenie. Instrukcja:
Nazwa kolumny wyjściowej może być używana do odwoływania się do wartości kolumny w ORDER BY i GROUP BY klauzul, ale nie w WHERE lub HAVING klauzule; tam musisz zamiast tego napisać wyrażenie.
Odwróciłem kolejność tabel w FROM klauzuli i wyczyszczono nieco składnię, aby była mniej zagmatwana. USING jest tutaj tylko udogodnieniem.
Użyłem LEFT JOIN zamiast JOIN , więc nie wykluczasz licencji bez żadnych dzienników.
Tylko wartości inne niż null są liczone przez count() . Ponieważ chcesz liczyć powiązane wpisy w tabeli "Log" bezpieczniej i nieco taniej jest używać count(b.license_id) . Ta kolumna jest używana w łączeniu, więc nie musimy się martwić, czy kolumna może być pusta, czy nie.count(*) jest jeszcze krótsza i nieco szybsza. Jeśli nie masz nic przeciwko zliczeniu 1 dla 0 wierszy w lewej tabeli, użyj tego.
Poza tym:radzę nie używać identyfikatorów wielkości liter w Postgresie, jeśli to możliwe. Bardzo podatny na błędy.