PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL Warunek „Gdzie liczyć”

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodawanie klucza obcego do modelu rails

  2. Praca w kierunku Postgres-XL 9,5

  3. Wygląda na to, że tryb postgresql H2 nie działa dla mnie

  4. Indeks do znajdowania elementu w tablicy JSON

  5. Jak skonfigurować PostgreSQL, aby akceptował wszystkie połączenia przychodzące?