【问题标题】:"ORA-00913: too many values" error when I run SQL query运行 SQL 查询时出现“ORA-00913: too many values”错误
【发布时间】:2011-12-02 07:40:41
【问题描述】:

我收到“值太多”错误,我不知道如何处理它。问题从第一个嵌套的 SELECT 开始

SELECT p.name, p.phone_number 
    FROM person p WHERE 
    (SELECT ks.title, ks.ks_code 
    FROM required_skills rs JOIN knowledge_skills ks USING (ks_code) 
    WHERE rs.pos_code = 'CS1') 
    IN (SELECT ks.title, ks.ks_code 
        FROM courses_taken ct  JOIN course_learning_units clu 
        USING (c_code)  JOIN learning_unit_skills lus USING (lu_code) 
        JOIN knowledge_skills ks USING (ks_code))

我查了info about this error,我相信这是因为 WHERE 中的子查询返回了太多列。表格数据如下。但是我怎样才能减少它呢?我感谢任何指点,谢谢

所需技能

POS_CODE    VARCHAR2(10 BYTE)   Yes     1   
KS_CODE VARCHAR2(10 BYTE)   Yes     2   

learning_unit_skills

LU_CODE VARCHAR2(10 BYTE)   Yes     1   
KS_CODE VARCHAR2(10 BYTE)   Yes     2

PER_ID  NUMBER(38,0)    No      1   
NAME    VARCHAR2(255 BYTE)  Yes     2   
STREET  VARCHAR2(255 BYTE)  Yes     3   
CITY    VARCHAR2(60 BYTE)   Yes     4   
ZIP_CODE    VARCHAR2(60 BYTE)   Yes     5   
PHONE_NUMBER    VARCHAR2(255 BYTE)  Yes     6   
GENDER  VARCHAR2(6 BYTE)    Yes     7   

课程学习单元

C_CODE  VARCHAR2(10 BYTE)   Yes     1   
LU_CODE VARCHAR2(10 BYTE)   Yes     

参加的课程

C_CODE  VARCHAR2(10 BYTE)   Yes     1   
PER_ID  NUMBER(38,0)    Yes     2   

【问题讨论】:

  • 在您的查询中,在第一个 where 条件没有提到字段或列之后
  • 你的其他表和person有什么关系?
  • @MichałPowaga - 谢谢 - 是的,这是在课程表上
  • 子查询(在 IN 运算符之前)不会返回“太多列”,但会返回太多行。

标签: sql oracle oracle11g ora-00913


【解决方案1】:

快速重写:

SELECT p.name, p.phone_number 
    FROM person p WHERE EXISTS
    (SELECT * 
    FROM required_skills rs JOIN knowledge_skills ks USING (ks_code) 
    WHERE rs.pos_code = 'CS1'
      AND (ks.title, ks.ks_code)
    IN (SELECT ks.title, ks.ks_code 
        FROM courses_taken ct  JOIN course_learning_units clu 
        USING (c_code)  JOIN learning_unit_skills lus USING (lu_code) 
        JOIN knowledge_skills ks USING (ks_code))
    )

或(连接可能需要更正):

SELECT p.name, p.phone_number 
    FROM person p WHERE EXISTS
    (SELECT * 
     FROM required_skills rs JOIN knowledge_skills ks USING (ks_code) 
        JOIN ( courses_taken ct  JOIN course_learning_units clu 
               USING (c_code)  JOIN learning_unit_skills lus USING (lu_code) 
              ) USING (ks_code)
     WHERE rs.pos_code = 'CS1'
    )

问题是在您的代码中与表person 没有关系。我想您应该在子查询中添加一个 - 使它们相互关联。

【讨论】:

  • 非常感谢!做到了(我很惊讶重写是多么强大)!非常感谢
  • 好吧,您可能在其中一张表中有person_code,可能在required_skillsknowledge_skills 中。
  • 您可以在子查询中添加WHERE rs.person_code = p.person_code
  • 我以为你已经有了。反正我们几乎不可能知道哪些字段属于哪个表,因为你不用ON而是USING
  • 不,USING 更紧凑。如果您喜欢它,请使用它。但是,如果您希望我们更好地理解结构,请发布表格的定义。
【解决方案2】:

在“in”的地方使用“exists”可能对你有帮助

【讨论】:

    【解决方案3】:
    CREATE TABLE EMP(EMPNO NUMBER(4) NOT NULL,
            ENAME VARCHAR2(10),
            JOB VARCHAR2(9),
            MGR NUMBER(4),
            HIREDATE DATE,
            SAL NUMBER(7, 2),
            COMM NUMBER(7, 2),
            DEPTNO NUMBER(2));
    
    
    INSERT INTO EMP VALUES
            (7369, 'SMITH',  'CLERK',     7902,
            TO_DATE('17-DEC-1980', 'DD-MON-YYYY'),  800, NULL, 20);
    

    在插入值时,它会给许多值带来错误

    我有这个表格的表格脚本,当我插入它时它会出现很多错误,而在我的桌面上它可以正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多