当前位置: 首页 > 知识库问答 >
问题:

oracle中的group by和union

茹航
2023-03-14

我想合并2个查询,但在oracle中遇到错误。

select count(*) as faultCount,
       COMP_IDENTIFIER 
from CORDYS_NCB_LOG 
where AUDIT_CONTEXT='FAULT' 
union 
select count(*) as responseCount,
       COMP_IDENTIFIER 
from CORDYS_NCB_LOG 
where AUDIT_CONTEXT='RESPONSE' 
group by COMP_IDENTIFIER  
order by responseCount; 

两个查询可以完美地单独运行,但是当使用并集时,它显示ORA-00904:“RESPONSECOUNT”:无效的标识符

共有3个答案

戚俊健
2023-03-14

在Union或Union中,所有查询列名都由第一个查询列名确定。

在您的查询中,将“请按响应计数订购”替换为“请按故障计数订购”。

颜哲彦
2023-03-14

联合的列名由第一个查询确定。因此,您的第一列实际上被命名为< code>FAULTCOUNT。

但是,对并集结果进行排序的最简单方法是使用列索引:

select ...
union 
select ...
order by 1;

您很可能还想使用UNION ALL,它避免删除两个查询之间的重复项,并且比纯UNION更快

柳镜
2023-03-14

在Oracle中,最好总是以相同的方式命名每个联合子查询中的每一列。在您的情况下,以下操作应该有效:

select count(*) as theCount,
       COMP_IDENTIFIER 
from CORDYS_NCB_LOG 
where AUDIT_CONTEXT='FAULT' 
group by COMP_IDENTIFIER -- don't forget this
union 
select count(*) as theCount,
       COMP_IDENTIFIER 
from CORDYS_NCB_LOG 
where AUDIT_CONTEXT='RESPONSE' 
group by COMP_IDENTIFIER  
order by theCount; 

另请参见:

Oracle UNION和ORDER BY的奇怪问题

当然,一个好的解决方法是使用索引列引用,如A_horse_with_no_name所建议的

然而,从您的评论来看,我怀疑您想编写一个完全不同的查询,即:

select count(case AUDIT_CONTEXT when 'FAULT'    then 1 end) as faultCount,
       count(case AUDIT_CONTEXT when 'RESPONSE' then 1 end) as responseCount,
       COMP_IDENTIFIER 
from CORDYS_NCB_LOG 
where AUDIT_CONTEXT in ('FAULT', 'RESPONSE')
group by COMP_IDENTIFIER  
order by responseCount; 
 类似资料:
  • 我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。

  • 问题内容: 我有一个这样的数据框说 和会话和收入的每个值代表了一种类型的,我要统计每个种类的数量表示的数量和的为1。 在无法输出所需结果后,我发现简单的调用函数。 我怎样才能做到这一点? 问题答案: 您似乎想一次按几列分组: 应该给你你想要的

  • 我试图使用querydsl-collections,但未能编写简单的groupBy表达式。以下是我的尝试: 但当我试着运行它的时候。我得到:

  • 本文向大家介绍Oracle中的Oracle Golden Gate和Oracle Active Guard之间的区别,包括了Oracle中的Oracle Golden Gate和Oracle Active Guard之间的区别的使用技巧和注意事项,需要的朋友参考一下 Oracle Golden Gate和Oracle Active Data Guard是数据复制技术。它们都用于数据复制,但是策略不

  • 我有一堆数据帧,我连接成一个大数据帧。所有行都有一个datetime、一个名称,然后是一些具有随机值的列,例如,数据帧可以如下所示: 现在,我需要按对这些行进行分组,并将它们分成60分钟的bins,我目前的做法如下: 这可以用任何方式来完成吗?或者我必须将我的数据帧一分为二,然后在之后加入?