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.