我正在尝试将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
答案 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)
当然,如果您在查询中使用val2
和val3
(对于col2
和col3
进行过滤)并且没有匹配项,那么查询将返回没有行。你想把它的数量放在0?它应该在col1, col2, col3, col4
中显示什么?
我想我明白你想要什么(顺便提一下这是一个非常不寻常的要求) - 如果没有匹配,你只想返回一行,COUNT
和null
为0对于col1, col2, col3, col4
(或者您希望val2
为col2
,val3
为col3
?)您可以轻松完成此操作(并且您不需要加入),就像这样......它为你现有的查询添加了一点点。
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
)