如何右键联接这些序列,以便此查询在postgresql中返回count=0的结果?

ih99xse1  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(305)

我在postgresql数据库上运行以下查询:

SELECT NULL AS fromdate,
       l.eventlevel,
       SUM(CASE
               WHEN e.id IS NULL THEN 0
               ELSE 1
           END) AS COUNT
FROM event e
RIGHT JOIN
  (SELECT generate_series(0, 3) AS eventlevel) l ON e.event_level = l.eventlevel
WHERE e.project_id = :projectId
GROUP BY l.eventlevel
ORDER BY l.eventlevel DESC

使用(修剪过的)事件表:

TABLE public.event
    id uuid NOT NULL,
    event_level integer NOT NULL

这是Bucked查询的一个变体,但包含所有数据,因此为空fromdate。我想从table上数数 event 并按事件级别计算。但我也想知道号码 0 在该特定事件级别没有任何事件时返回。但目前的右翼联盟并没有做到这一点。我做错什么了?我还尝试添加 OR e.project_id IS null 认为它可能过滤掉了0个计数。或者交叉连接会起作用吗?如果是,怎么做?
当前结果:

+----------+------------+-------+
| fromdate | eventlevel | count |
+----------+------------+-------+
| null     |          3 |     1 |
+----------+------------+-------+

期望结果:

+----------+------------+-------+
| fromdate | eventlevel | count |
+----------+------------+-------+
| null     |          3 |     1 |
| null     |          2 |     0 |
| null     |          1 |     0 |
| null     |          0 |     0 |
+----------+------------+-------+
omjgkv6w

omjgkv6w1#

我建议避免 RIGHT JOIN s和使用 LEFT JOIN s。对于遵循逻辑来说,它们更简单——将所有内容都保留在第一个表中,并在随后的表中匹配行。
您的问题是过滤器的位置——它过滤掉外部连接的行。所以这需要深入研究 ON 条款。我建议:

SELECT NULL AS fromdate, gs.eventlevel,
       COUNT(e.id) as count
FROM generate_series(0, 3) gs(eventlevel) LEFT JOIN
     event e
     ON e.event_level = gs.eventlevel AND e.project_id = :projectId
GROUP BY gs.eventlevel
ORDER BY gs.eventlevel DESC;

请注意其他简化:
不需要子查询 generate_series .
你可以用 COUNT() 而不是你的案例逻辑。

daupos2t

daupos2t2#

你得把车开走 e.project_id 来自 WHERE 条款 ON 要实现的子句 RIGHT JOIN 结果:

...
           END) AS COUNT
FROM event e
RIGHT JOIN
  (SELECT generate_series(0, 3) AS eventlevel) l ON e.event_level = l.eventlevel
AND e.project_id = :projectId
...

相关问题