【问题标题】:ORA-00913 "Too Many Values" Oracle SQLORA-00913“值太多”Oracle SQL
【发布时间】:2021-07-29 10:10:15
【问题描述】:

这是更大查询的一部分。每个查询都独立工作。当我将第一个查询中的成绩与一个常数(即 50)进行比较时,它也有效。

但是,当我将它们放在一起时,我收到了这个非常无用的错误消息。 Oracle SQL 的错误消息通常无济于事,但我通常可以通过自己的方式找到解决方案。

这一次我不知道该怎么做,因为每个查询都是独立工作的,而 avg(grade) 是一个常数,就像数字 50 是一个常数一样。

如果每个部分都有效,并且如果第一部分使用不同的常量,而第二部分返回一个常量,那么问题是什么?

    select stud_id, title, grade
        from uni_enrollment a
        inner join uni_course b
            using (course_id)
        where title = 'Canadian History' and grade 
            > (
                select avg(grade), title
                    from uni_enrollment a
                    inner join uni_course b
                        on a.course_id = b.course_id
                    where title = 'Canadian History'
                    group by (title)                        
                );

好的,多亏了下面的提示,我得到了一些有用的东西。在这里,为了后代:

    select stud_id, title, grade
        from uni_enrollment a
        inner join uni_course b
            using (course_id)
        where title = 'Canadian History' and grade 
            > (
                select sum(grade)/count(*)
                    from uni_enrollment a
                    inner join uni_course b
                        on a.course_id = b.course_id
                    where title = 'Canadian History'                       
                );

【问题讨论】:

    标签: sql oracle subquery


    【解决方案1】:

    这个子查询:

    select avg(grade), title
      from uni_enrollment a
      inner join uni_course b
              on a.course_id = b.course_id
      where title = 'Canadian History'
      group by (title)   
    

    返回平均每个标题,以及标题。您的查询如下所示:

    ... and grade > (select avg(grade), title
    

    计算为例如

    ... and 73 > (50, 'Canadian History'
    

    73 不能大于 50, 'Canadian History' - 它只能大于 50。因此,从子查询的select 语句的列列表中删除title

    and grade > (select avg(grade)
                 from ...
    

    Oracle SQL 的错误信息通常没有帮助

    当然可以,但前提是您不知道如何解释它们。不过,这不仅仅是 Oracle 的问题。

    【讨论】:

    • 令人恼火的是,Oracle 让我们选择以后要分组的任何列。我的老师建议其他版本的 SQL 不是这样的。我想我会更喜欢那个。不管怎样,有了你的提示,我解决了。
    【解决方案2】:

    我们在课堂上学习的 Oracle 版本迫使我们选择以后要分组的任何列,显然这就是导致我的问题的原因。解决方案是在没有 group by 子句的情况下重写查询。否则它将无法正常工作。我希望这在以后的版本中得到修复,因为它不是很好。

    【讨论】:

    • 您使用的是什么版本的 Oracle?我已经使用 Oracle 很长时间了,这从来都不是我所知道的限制。这不是对 11.2 (dbfiddle.uk/…) 的限制,它已被取消支持一段时间,并且已经过时了 6 或 7 个主要修订版。
    • 您遇到的限制是,如果您在比较谓词中使用子查询,即grade > (subquery),子查询必须只包含一列 - 否则你得到ORA-00913: too many values。这是自然的和预期的,不会在以后的版本中更改,因此请编辑指向此问题的答案并将正确的查询移到那里(您粘贴在问题中)。这是一个高质量的网站,所以在你写东西之前一定要仔细检查,否则你会投反对票。
    • @mtchk 您不必选择分组依据的列 - 反之亦然。为什么你要选择那些你没有分组或聚合的列?仅仅因为其他风格的 SQL 可能让你这样做并不意味着这样做是正确的(或者,正如我母亲所说,“仅仅因为你可以跳下悬崖并不意味着你应该!”;)) .你会在其他列中显示什么?随机值?无论如何,我很确定您的原始查询在其他 SQL 风格中也会失败,因为您所要求的没有意义!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多