sql >> Databáze >  >> RDS >> PostgreSQL

Proč se výsledek COUNT zdvojnásobí, když se připojím dva?

Na to je velmi jednoduché odpovědět. Máte dva record a dva alarm . Připojíte se k nim a získáte čtyři záznamy, které spočítáte.

Tento problém můžete vyřešit spočítáním různých ID:

COUNT(DISTINCT records.id) AS "last24HMessagesCount",
COUNT(DISTINCT alarms.id) AS "activeAlarmsCount"

ale tohle bych nedoporučoval. Proč se připojujete k record a alarm tak jako tak? Nesouvisí přímo. Co chcete pro připojení je počet record a číslo alarm . Takže agregujte před připojením:

SELECT 
  device.id, 
  device.name, 
  records.cnt AS "last24HMessagesCount", 
  alarms.cnt AS "activeAlarmsCount"
FROM device
LEFT OUTER JOIN 
(
  SELECT deviceId, count(*) AS cnt
  FROM record
  WHERE "date" > '2017-07-12 11:43:02.838 +00:00'
  GROUP BY deviceId
) AS records ON device.id = records.deviceId
LEFT OUTER JOIN 
(
  SELECT deviceId, count(*) AS cnt
  FROM alarm
  WHERE status = 'new'
  GROUP BY deviceId
) AS alarms ON device.id = alarms.deviceId
WHERE device.serviceId = 1832
  AND device.groupId = 205;

(Odstranil jsem zbytečné připojení k tabulce "skupiny".)



  1. Rozdíl mezi poddotazem a korelovaným poddotazem

  2. Generování a čtení čárového kódu

  3. MySQL – nejlepší metoda pro zpracování těchto hierarchických dat?

  4. Chyba predikátu s Oracle VPD/RLS