sql >> データベース >  >> RDS >> PostgreSQL

2つの結合を行うと、COUNTの結果が2倍になるのはなぜですか?

    これは答えるのがとても簡単です。 2つのrecordがあります および2つのalarm 。これらに参加して、カウントする4つのレコードを取得します。

    個別のIDをカウントすることで、この問題を回避できます。

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

    しかし、私はこれをお勧めしません。なぜrecordに参加するのですか およびalarm とりあえず?それらは直接関係していません。 欲しい 参加するのはrecordの数です およびalarmの数 。したがって、参加する前に集約します:

    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;
    

    (「グループ」テーブルへの不要な結合を削除しました。)



    1. PostgreSQLとActiveRecordが競合状態を副選択

    2. パラメータとともに使用する場合にOR句の使用を最適化する方法(SQL Server 2008)

    3. 2番目のストアドプロシージャを使用して、Oracleストアドプロシージャによって返された結果セットを別のテーブルに挿入するにはどうすればよいですか?

    4. SQLServerで文字列値とNULL値を連結する方法