当使用 * 而不是命名字段并使用 NVL 或 COALESCE 时没有返回结果时,是否有任何方法可以将子查询聚合函数中的字段值默认为零?
例如这是我所拥有的一个过于简化的版本:
SELECT *
FROM WIDGETS
LEFT JOIN (
SELECT widget_id, count(*) as total,
SUM(CASE WHEN status='closed' THEN 1 ELSE 0 END) AS open,
SUM(CASE WHEN status='open' THEN 1 ELSE 0 END) AS closed
FROM WIDGET_ISSUES
GROUP BY widget_id
) AS ISSUES
ON WIDGETS.widget_id=ISSUES.widget_id
执行该查询时,有些小部件当前没有任何问题,因此总数应返回零。但是,由于问题表中不存在给定的 widget_id,因此没有结果,并且“open”和“close”的值为空而不是零。
我知道我可以这样做,而不是从主查询中执行 SELECT * : NVL(打开,0) AS 打开,NVL(关闭,0) AS 关闭
但是,我试图不这样做,因为与这个简单的示例不同,真实的示例相当复杂,并且有大量的聚合函数值。我试图防止在更改子查询时需要更改主查询,以使维护更简单。
一个完全可以接受的答案是“这是不可能的,你必须使用NVL”;我只是想确保在我采用该解决方案之前没有任何创造性的解决方案;因为如果只需要更改子查询就可以完成此操作,那么从长远来看,这将使我的生活变得更加轻松。
如果您准备好承担额外加入的费用
SELECT *
FROM WIDGETS
LEFT JOIN (
SELECT w.widget_id, count(*) as total,
SUM(CASE WHEN status='closed' THEN 1 ELSE 0 END) AS open,
SUM(CASE WHEN status='open' THEN 1 ELSE 0 END) AS closed
FROM WIDGETS w
left join WIDGET_ISSUES wi on w.widget_id=wi.widget_id
GROUP BY w.widget_id
) AS ISSUES
ON WIDGETS.widget_id=ISSUES.widget_id