Mat*_*thu 3 postgresql join subquery coalesce
我正在尝试计算从子查询中检索的列数,并且某些子查询可能为空。因此,我不想将其显示为空单元格,而是希望它为 0。发现我可以通过使用该COALESCE
函数来做到这一点,但例如此查询仍然给我一个空单元格:
CREATE VIEW third_table AS
SELECT *
FROM (second_table
NATURAL FULL JOIN (
SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79
FROM (
SELECT assignment_id, mark_as_percent
FROM avg_required_table
WHERE mark_as_percent >= 60
AND mark_as_percent < 80
) a
GROUP BY assignment_id
) b);
Run Code Online (Sandbox Code Playgroud)
这是COALESCE
应该如何使用?
COALESCE
你把它放在哪里是完全没有意义的。聚合函数count()
永远不会返回NULL
。逻辑规定num_60_79
子查询中的值永远不能低于 1。有关的:
但这无关紧要。不返回行的子查询根本无法返回任何值。
准确地说,在您的情况下,子查询可能会返回任意数量的行,但是,当加入 时second_table
,如果没有行匹配,(assignment_id, num_60_79)
则子查询中的所有列都b
将填充NULL
值。看:
NATURAL FULL JOIN
是一种非常奇特的连接表的方式。特别是对于仍在学习如何使用的人来说COALESCE
。手册:
NATURAL
是一个列表的简写USING
,其中提到了两个表中具有相同名称的所有列。
和:
FULL OUTER JOIN
返回所有连接的行,加上每个不匹配的左侧行(在右侧用空值扩展)的一行,以及每个不匹配的右侧行(在左侧用空值扩展)的一行。
我认为可以安全地假设num_60_79
in 中没有命名的列second_table
,并且如果有的话,您肯定不会希望将其包含在连接条件中。您只想加入 列assignment_id
,这就是您应该在查询中放入的内容而不是关键字NATURAL
。
另外,虽然FULL JOIN
理论上这是可能的,但我们通常会看到LEFT JOIN
.
您也不需要查询中的两层子查询和其他一些噪音。
考虑到所有事情,当你...
尝试计算从子查询中检索的列数
...我有根据的猜测是您想要这个查询:
SELECT s.*, COALESCE(b.num_60_79, 0) AS num_60_79
FROM second_table s
LEFT JOIN (
SELECT assignment_id, count(*) AS num_60_79
FROM avg_required_table
WHERE mark_as_percent >= 60
AND mark_as_percent < 80
GROUP BY assignment_id
) b USING (assignment_id);
Run Code Online (Sandbox Code Playgroud)