如果表 - Oracle DB中没有匹配的行,则无法获得计数0

时间:2016-08-16 15:03:44

标签: oracle

我正在尝试将Count和其他几列与计数一起使用。 如果匹配但以下查询有效,但如果没有匹配,则不会使用' 0'返回计数。 以下查询按降序排列匹配条件。 如果没有匹配,则相同(它应该以日期降序返回一行)。

SELECT * 
FROM (select  COUNT(*)  COUNT, col1, col2, col3, col4
      from table
     GROUP BY col1, col2, col3, col4
      ORDER BY DATE(col4) desc)T 
where col2=value 
AND col3=value 
AND ROWNUM =1

2 个答案:

答案 0 :(得分:0)

如果您希望在输出中获取数据,即使表中没有匹配的数据,您也应该考虑LEFT JOIN

此查询可以执行此操作。即使表中没有匹配项,它也能确保您获得搜索条件的行。

SELECT * FROM (
WITH search_values AS ( SELECT 'col2_value_you_want' col2_value, 'col3_value_you_want' col3_value FROM DUAL )
select  COUNT(yt.some_non_null_column)  CNT, yt.col1, sv.col2_value col2, sv.col3_value col3, yt.col4
from    search_values sv LEFT JOIN your_table yt ON yt.col2 = sv.col2_value and y2.col3 = sv.col3_value
GROUP BY yt.col1, sv.col2_value, sv.col3_value, yt.col4
ORDER BY DATE(yt.col4) desc
) WHERE ROWNUM = 1;

在下面的两个查询中,对于那些没有数据模型的人,使用DBA_OBJECTS应用相同的概念。第一个例子使用匹配的条件;第二个示例使用没有匹配的条件。

SELECT * FROM (
WITH search_values AS ( SELECT 'SYS' owner, 'TABLE' object_type FROM DUAL )
select  COUNT(yt.object_id)  CNT, yt.object_id, sv.owner, sv.object_type, yt.last_ddl_time
from    search_values sv LEFT JOIN dba_objects yt ON yt.owner = sv.owner and yt.object_type = sv.object_type
GROUP BY yt.object_id, sv.owner, sv.object_type, yt.last_ddl_time
ORDER BY yt.last_ddl_time desc
) WHERE ROWNUM = 1;

......和......

SELECT * FROM (
WITH search_values AS ( SELECT 'NOT_A_USER' owner, 'TABLE' object_type FROM DUAL )
select  COUNT(yt.object_id)  CNT, yt.object_id, sv.owner, sv.object_type, yt.last_ddl_time
from    search_values sv LEFT JOIN dba_objects yt ON yt.owner = sv.owner and yt.object_type = sv.object_type
GROUP BY yt.object_id, sv.owner, sv.object_type, yt.last_ddl_time
ORDER BY yt.last_ddl_time desc
) WHERE ROWNUM = 1;

答案 1 :(得分:0)

当然,如果您在查询中使用val2val3(对于col2col3进行过滤)并且没有匹配项,那么查询将返回没有行。你想把它的数量放在0?它应该在col1, col2, col3, col4中显示什么?

我想我明白你想要什么(顺便提一下这是一个非常不寻常的要求) - 如果没有匹配,你只想返回一行,COUNTnull为0对于col1, col2, col3, col4(或者您希望val2col2val3col3?)您可以轻松完成此操作(并且您不需要加入),就像这样......它为你现有的查询添加了一点点。

SELECT max(COUNT) as COUNT, max(col1) as col1, max(col2) as col2, max(col3) as col3,
       max(col4) as col4
FROM (
         SELECT * 
         FROM (select  COUNT(*)  COUNT, col1, col2, col3, col4
               from table
               GROUP BY col1, col2, col3, col4
               ORDER BY DATE(col4) desc)T 
         where col2=value 
         AND col3=value 
         AND ROWNUM =1

       UNION ALL

         SELECT 0, null, null, null, null FROM dual
     )