PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL Където условие за броене

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)

От Postgres 9.1 първичният ключ покрива всички колони на таблица в GROUP BY клауза. В по-старите версии ще трябва да добавите a.limit_call към GROUP BY списък. Бележки към версията за 9.1:

Разрешаване на не-GROUP BY колони в списъка с цели на заявката, когато първичният ключ е посочен в GROUP BY клауза

Допълнително четене:

  • Защо не мога да изключа зависими колони от „GROUP BY“, когато агрегирам по ключ?

Състоянието, което сте имали в WHERE клаузата трябва да се премести в HAVING клауза, тъй като се отнася до резултата от агрегатна функция (след WHERE е приложен). И не можете да се позовавате на изходни колони (псевдоними на колони) в HAVING клауза, където можете да препращате само към входни колони. Така че трябва да повторите израза. Ръководството:

Името на изходна колона може да се използва за препращане към стойността на колоната вORDER BY и GROUP BY клаузи, но не и в WHERE или HAVING клаузи; там трябва да напишете израза вместо това.

Обърнах реда на таблиците в FROM клауза и почистих малко синтаксиса, за да го направи по-малко объркващо. USING тук е просто удобство при нотации.

Използвах LEFT JOIN вместо JOIN , така че изобщо не изключвате лицензи без никакви регистрационни файлове.

Само ненулеви стойности се отчитат от count() . Тъй като искате да преброите свързани записи в таблица "Log" по-безопасно и малко по-евтино е да използвате count(b.license_id) . Тази колона се използва в присъединяването, така че не е нужно да се притесняваме дали колоната може да бъде нула или не.
count(*) е още по-кратък и малко по-бърз. Ако нямате нищо против да получите брой 1 за 0 редове в лявата таблица, използвайте това.

Настрана:Бих посъветвал не да използвате смесени идентификатори в Postgres, ако е възможно. Много податливи на грешки.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да стартирам PostgreSQL на Windows?

  2. Изтриване на дублиращи се редове (не изтривайте всички дублирани)

  3. Как мога да накарам инсталирането на gem да работи на OS X Lion с Ruby 1.8.7 без сег неизправност?

  4. Как to_timestamp() работи в PostgreSQL

  5. Postgresql колоната не е намерена, но се показва в описанието