SQL 错误:ORA-00913:值太多 00913.00000 -“值太多”

Posted

技术标签:

【中文标题】SQL 错误:ORA-00913:值太多 00913.00000 -“值太多”【英文标题】:SQL Error: ORA-00913: too many values 00913. 00000 - "too many values" 【发布时间】:2014-05-19 13:11:37 【问题描述】:
select * from crew cr 
where cr.crew_supervisor_id in
(select *
from crew c
where not exists
(select crew_supervisor_id
from crew cr
where c.crew_id = cr.crew_supervisor_id))
order by crew_id;

所以我试图从我制作的表中提取信息,而 sql developer 不断弹出这个错误,有人可以帮助我吗?非常感谢

【问题讨论】:

您应该在 IN 子查询中指定一个列名,而不仅仅是 * - 这意味着所有字段。我想应该是c.crew_id 是的,* 会导致语法错误。但是我想这不是你唯一的问题。查询实际上应该返回什么? 【参考方案1】:

问题是子查询中的select *。与in 一起使用的子查询只能返回一个值。

select *
from crew cr 
where cr.crew_supervisor_id in (select crew_id
                                from crew c
                                where not exists (select crew_supervisor_id
                                                  from crew cr
                                                  where c.crew_id = cr.crew_supervisor_id
                                                 )
                               )
order by crew_id;

【讨论】:

语法正确。然而,问“给我所有主管 ID 是现有船员 ID 但不是现有主管 ID 的记录”永远不会返回任何记录,对吧? @ThorstenKettner 。 . .我试图避免理解查询。我真的无法遵循嵌套的exists/in 构造,让我的头爆炸。毫无疑问,还有其他方法可以做同样的事情。【参考方案2】:

正如其他人所指出的,IN 条件要求您在子查询中指定列名。请参考这个Oracle documentation。

以下查询将返回不是任何其他船员的主管的所有船员,没有任何错误。此外,JOIN 会执行得非常好。

SELECT
  CREWS.*
FROM
  (
    SELECT * FROM CREW
  )
  CREWS
LEFT OUTER JOIN
  (
    SELECT DISTINCT CREW_SUPERVISOR_ID FROM CREW
  )
  SUPERVISORS
ON
  CREWS.CREW_ID = SUPERVISORS.CREW_SUPERVISOR_ID
WHERE
  SUPERVISORS.CREW_SUPERVISOR_ID IS NULL;

SQL Fiddle demo

【讨论】:

以上是关于SQL 错误:ORA-00913:值太多 00913.00000 -“值太多”的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL: ORA-00913: 值太多

ORA-00913: oracle 子查询中的值太多

SQL、值过多、结果合并

ORA-00913: 使用大小写时值太多

ORA-00913: 值过多

PL/SQL 过程 - 值太多