首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00920:使用IN运算符时无效的关系运算符

ORA-00920:使用IN运算符时无效的关系运算符
EN

Stack Overflow用户
提问于 2019-10-20 14:18:25
回答 3查看 297关注 0票数 1

我有一张桌子col,我有:

代码语言:javascript
复制
select * from offc.col;

我使用按年查询ans dept_id wise返回了一些数据:

代码语言:javascript
复制
 SELECT dept_id, 
       year, 
       Max(marks) marks 
FROM   offc.col 
GROUP  BY dept_id, 
          year 
ORDER  BY dept_id, 
          year 

我得到的数据是:

这里没有问题,因为我的sql正在运行right.So,我需要提取col表的所有信息,所以我将子查询用作:

代码语言:javascript
复制
SELECT * 
FROM   offc.col 
WHERE  ( dept_id, year, marks ) IN (SELECT dept_id, 
                                           year, 
                                           Max(marks) marks 
                                    FROM   offc.col 
                                    GROUP  BY dept_id, 
                                              year 
                                    ORDER  BY dept_id, 
                                              year); 

但是,我犯了错误,因为:

代码语言:javascript
复制
ORA-00920: invalid relational operator 

我也在其他页面搜索了这个错误,但是在我的例子中,我发现这些错误作为error.But的括号错了,我不知道这里发生了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-20 14:20:41

您可以使用关联子查询进行筛选,而不是聚合:

代码语言:javascript
复制
select c.*
from offc.col c
where marks = (
    select max(marks)
    from offc.col c1
    where c1.dept_id = c.dept_id and c1.year = c.year
)
order by dept_id, year 

(dept_id, year, marks)上的索引将加快此查询的速度。

另一个选项是使用窗口函数row_number()

代码语言:javascript
复制
select *
from (
    select 
        c.*, 
        row_number() over(partition by dept_id, year order by marks desc) rn
    from offc.col c
) x
where rn = 1
order by dept_id, year 

如果您确实希望坚持聚合,那么您可以将您的子查询与原始表连接,如下所示:

代码语言:javascript
复制
select c.* 
from offc.col c
inner join (
    select dept_id, year, max(marks) marks 
    from offc.col 
    group  by dept_id, year 
) m 
    on m.dpt_id = c.dept_id
    and m.year = c.year
    and m.marks = m.marks
票数 1
EN

Stack Overflow用户

发布于 2019-10-20 14:28:34

我建议使用dense_rank分析函数,因为如果两个部门在同一年有相同的分数,它们可以返回(您当前的逻辑与此相同)。

Row_number只会给你一个随机记录,如果两个部门在同一年有相同的分数。

代码语言:javascript
复制
select *
from (
    select 
        c.*, 
        dense_rank() over(partition by dept_id, year order by marks desc nulls last) as dr
    from offc.col c
) x
where dr = 1
order by dept_id, year 

另外,您的查询是正确的,只需从其中移除顺序即可。

代码语言:javascript
复制
SELECT * 
FROM   offc.col 
WHERE  ( dept_id, year, marks ) IN (SELECT dept_id, 
                                           year, 
                                           Max(marks) marks 
                                    FROM   offc.col 
                                    GROUP  BY dept_id, 
                                              year 
                                    -- ORDER  BY dept_id,                                              
                                -- year
); 

演示的错误与order by和工作良好,没有order by

干杯!!

票数 2
EN

Stack Overflow用户

发布于 2019-10-20 16:52:22

使用子查询执行内部连接:

代码语言:javascript
复制
SELECT c.*
  FROM offc.col c
  INNER JOIN (SELECT dept_id, 
                     year, 
                     Max(marks) AS MAX_MARK
                FROM offc.col 
                GROUP BY dept_id, 
                         year) s
    ON s.DEPT_ID = c.DEPT_ID AND
       s.YEAR = c.YEAR AND
       s.MAX_MARK = c.MARKS
  ORDER BY c.DEPT_ID, c.YEAR

内部联接只返回满足联接条件的行,因此OFFC.COL中没有特定DEPT_ID和年份标记最大值的任何行都不会被返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58473905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档