即使没有记录,我也需要一个查询来返回记录。在有记录的情况下,我只想要返回那些记录。另一方面,当没有记录时,我需要它仍然返回一条记录,但“context”列的值(GROUP BY
列)等于GROUP BY
列的值不符合标准和聚合函数/列的默认值(例如,0
)。我尝试了一个子查询:
SELECT
(
SELECT
CONTEXT,
SUM(VAL)
FROM
A_TABLE
WHERE
COL = 'absent'
GROUP BY
CONTEXT
)
FROM
DUAL;
但子查询SELECT
子句中大于一列的任何内容都无法使用“太多值”消息。
我还尝试了一个UNION(有更多的背景来更忠实地代表我的情况):
SELECT
*
FROM
(
SELECT
CONTEXT,
SUM(VAL)
FROM
A_TABLE
WHERE
COL = 'absent'
GROUP BY
CONTEXT
UNION
SELECT
CONTEXT,
0
FROM
B_TABLE
)
AB_TABLE
INNER JOIN C_TABLE C -- just a table that I need to join to
ON
C.ID = AB_TABLE.C_ID
WHERE
C.ID = 10
AND ROWNUM = 1 -- excludes 2nd UNION subquery result when 1st returns record;
这个确实有效但我不知道为什么因为第二个UNION子查询似乎没有与第一个明确连接(我需要第二个CONTEXT值与第一个相同的第一个CONTEXT值)不返回任何记录)。问题是当我尝试实现类似的策略时,真正的查询不会返回任何记录。我想看看是否有更好的方法来解决这个问题,并且可能让它适用于真正的查询(不包括因为它太大而且有些敏感)。
答案 0 :(得分:3)
我不确定我理解这个问题,但试试吧。
我相信你说的就是这个。您有一个名为A_TABLE
的表,其中包含CONTEXT, VAL, COL
列(也可能是其他列)。
您希望按CONTEXT
进行分组,并获得VAL
的总和,但仅适用于COL = 'absent'
的行。否则你想要返回一个默认值(假设为0)。
这可以通过条件聚合来完成。条件位于CASE
内的SUM
表达式中,而不是WHERE
子句中(如您在COL='absent'
过滤时所见)WHERE
},子句,查询 - 超过WHERE
子句 - 不知道CONTEXT
值没有出现在COL = 'absent'
的任何行中。
如果“默认值”为NULL
,您可以这样做:
select context, sum(case when col = 'absent' then value end) as val
from a_table
group by context
;
如果默认值不是NULL
,则诱惑可能是在总和周围使用NVL()
。但是,如果VAL
可能是NULL
,那么即使有SUM(VAL)
行,NULL
也可能COL = 'absent'
。为了解决这种可能性,您必须在这些情况下将总和保留为NULL
,而只有在没有COL = 'absent'
的行时才将值设置为0(或其他任何“默认值”)。这是一种方法。仍然是标准的“条件”聚合查询:
select context,
case when count(case when col = 'absent' then 1 end) > 0
then sum(case when col = 'absent' then value end)
else 0 -- or whatever "default value" you must assign here
end as val
from a_table
group by context
;
答案 1 :(得分:1)
以下是另一种可以处理它的方法,它可以避免另外两个表(B_TABLE和C_TABLE)。
SELECT context
, MAX(val)
FROM (
SELECT context
, SUM(val) as val
FROM a_table
WHERE col = 'absent'
GROUP BY context
UNION
SELECT context
, 0 as val
FROM a_table
) t
GROUP BY context
这假定您要返回的默认值为0,并且A_TABLE.VAL中的任何值都是正整数。
答案 2 :(得分:0)
SELECT b.context
, sum(a.val)
FROM b_table b
LEFT OUTER JOIN a_table a
ON a.context = b.context
AND a.col = 'absent'
GROUP BY b.context