PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi le résultat de COUNT est-il double lorsque je fais deux jointures ?

C'est très simple à répondre. Vous avez deux record et deux alarm . Vous les rejoignez et obtenez quatre enregistrements, que vous comptez.

Vous pouvez contourner ce problème en comptant les ID distincts :

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

mais je ne le recommanderais pas. Pourquoi rejoignez-vous record et alarm De toute façon? Ils ne sont pas directement liés. Ce que vous voulez rejoindre est le nombre de record et le numéro d'alarm . Donc regroupez avant de rejoindre :

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;

(J'ai supprimé la jointure inutile à la table "groupe".)