【问题标题】:Nested Select errors with ORA-00913: too many valuesORA-00913 的嵌套选择错误:值太多
【发布时间】:2018-07-20 16:42:22
【问题描述】:

完全披露:绝对是新手编码员学习。我编写了以下选择例程,该例程会引发 ORA-00913:第 13 行第 18 列的值过多错误(地址信息的第二个嵌套选择语句)。我已经搜索并阅读了最简单的建议(确保您的括号匹配或查找拼写错误)以明确查看 WHERE 子句,使用 AS 或其他建议,但到目前为止还没有。

select distinct  
   (select u.misc_data 
              from ps_name_miscnmbr u                                       
              where (u.misc_id = 'RFID') and u.name_id = cn.name_id) RFID,
            cn.dflt_id StudentIdNumber,                                  
            cn.first_name FirstName,
            cn.last_name LastName,
            cn.middle_name MiddleName,
            'pot: 100' as CollegeCode,
            to_char (cn.date_birth, 'YYYY-MM-DD') DateOfBirth,
            p.area_code,
            p.phone_no,
            (select  a.line1 StreetAddress1,
                     a.line2 StreetAddress2,
                     a.city City,
                     a.stat_id ST,
                     a.postal Zip
                from co_v_dflt_addr a
                where (a.adty_id in ('LOCL','HOME') and a.name_id = cn.name_id)),
            e.email_address Email                       
    from co_name cn,
         sr_v_enroll s,
         co_name_demo d,
         co_v_name_email e,
         co_v_name_phone1 p
    where s.term_id in ('201701', '201702', '201703') 
        and s.name_id = cn.name_id
        and d.name_id = cn.name_id
        and e.name_id = cn.name_id
        and p.name_id = cn.name_id
order by LastName

当我为地址隔离第二个嵌套 Select 语句并自行运行它时,它会执行并生成我期望的列/记录。

(select distinct         cn.name_id,
                     a.line1 StreetAddress1,
                     a.line2 StreetAddress2,
                     a.city City,
                     a.stat_id State,
                     a.postal Zip
                from co_v_dflt_addr a,
                     co_name cn
                where (a.adty_id in ('LOCL','HOME') and a.name_id = cn.name_id))

当我注释掉地址的整个选择子查询时,例程的其余部分也会执行并生成我期望的列/记录。

select distinct  
   (select u.misc_data 
              from ps_name_miscnmbr u                                       
              where (u.misc_id = 'RFID') and u.name_id = cn.name_id) RFID,
            cn.dflt_id StudentIdNumber,                                  
            cn.first_name FirstName,
            cn.last_name LastName,
            cn.middle_name MiddleName,
            'pot: 100' as CollegeCode,
            to_char (cn.date_birth, 'YYYY-MM-DD') DateOfBirth,
            p.area_code,
            p.phone_no,
            e.email_address Email                       
    from co_name cn,
         sr_v_enroll s,
         co_name_demo d,
         co_v_name_email e,
         co_v_name_phone1 p
    where s.term_id in ('201701', '201702', '201703') 
        and s.name_id = cn.name_id
        and d.name_id = cn.name_id
        and e.name_id = cn.name_id
        and p.name_id = cn.name_id
order by LastName

有人可以在这里为新手提供有用的提示吗?我一直在不停地尝试那些无法让我到达终点的事情。

谢谢

【问题讨论】:

  • 你的内部查询是SELECT的一部分,所以你只能有一个值。如果您的内部查询产生行和列,那么它显然不会工作。
  • 也使用正确的JOIN。它已经存在了 20 多年了!!!

标签: sql oracle11g


【解决方案1】:

您在 select 语句中的子查询可能返回太多行。当您使用这样的子查询时,它只需要返回一行。

在这种情况下,您可能应该将表连接到查询的其余部分,如果有可能没有地址返回,则使用外连接。但是,如果它们同时具有“LOCL”和“HOME”地址,这将带回两行。设计选择取决于您。

【讨论】:

    【解决方案2】:

    看起来好像您正在为某种教育实体编写报告。如上所述,设计选择取决于您,但是,我发现我们的教职员工喜欢在一行中为每个学生记录提供尽可能多的信息。我会推荐以下(未经测试的代码,但向您展示了如何加入表格并返回结果,即使不存在数据而不返回学生的记录)。此外,如上所述,您试图在标量子查询中返回多个地址记录,但多个结果不能适合每个相应结果集的一列(因为它返回家庭和本地地址,但只有一列放入失败)。这里有一些需要审查和尝试的东西(这可能适用于 MSSQL,不确定 Oracle):

    select
    distinct
    u.misc_dta as StudentIDNumber,
    cn.dflt_id StudentIdNumber,                                  
    cn.first_name FirstName,
    cn.last_name LastName,
    cn.middle_name MiddleName,
    'pot: 100' as CollegeCode,
    to_char (cn.date_birth, 'YYYY-MM-DD') DateOfBirth,
    p.area_code,
    p.phone_no,
    h.line1 as HomeStreetAddress1,
    h.line2 as HomeStreetAddress2,
    h.city as HomeCity,
    h.stat_id HomeST,
    h.postal HomeZIP,
    l.line1 as LocalStreetAddress1,
    l.line2 as LocalStreetAddress2,
    l.city as LocalCity,
    l.stat_id LocalST,
    l.postal LocalZIP,
    e.email_address Email
    
    
    from
    co_name cn
    left join
    s_v_enroll s on cn.name_id = s.name_id
    left join
    co_name_demo d on cn.name_id = d.name_id
    left join
    co_v_name_email e on cn.name_id = e.name_id
    left join
    co_v_name_phone1 p on cn.name_id = p.name_id
    left join
    co_v_dflt_addra h on cn.name_id = h.name_id and h.adty_id = 'HOME'
    left join
    co_v_dflt_addra l on cn.name_id = l.name_id and h.adty_id = 'LOCL'
    left join
    ps_name_miscnbr as u on cn.name_id = u.name_id and u.misc_id = 'RFID'
    
    
    where
    s.term_id in ('201701', '201702', '201703') 
    
    order by
    cn.last_name
    

    【讨论】:

    • 感谢 B. Baum(你是对的,这是一个小专院校)提供的建议代码(它有效!),但也感谢 Zynon 和 Eric the Impaler 的提示/建议。这对初学者很有帮助。我之前的上下文只是前任编写的脚本示例。我不知道加入是你的朋友,不知道在哪里或如何使用它们,也不知道什么是“标量子查询”。行政类型听到“IT”并认为这都是一样的工作(这如何落在我的腿上)。非常感谢您宝贵的时间和慷慨的意见。你正在恢复对人类的信心。 :)
    • 不客气!我在我的 sql 数据中使用了很多“LEFT JOIN”命令,因为我们的教职员工想要这些列,即使没有数据。只要数据从第一个表(co_name)返回,那么您将获得其余的列。看看 INNER JOIN 和 RIGHT JOIN 也是如此。 w3schools.com/sql 是适合初学者的一个很好的资源。我理解“你在 IT 领域工作得很好,所以你可以做到这一点”。我们并不都做同样的工作,SQL/编程是一个非常专业的范围......遗憾的是,管理并不总是理解这一点。
    【解决方案3】:

    根据定义,标量子查询最多只能返回 1 行。可以是零行,也可以是一行;永远不会有两个或更多。

    您正在显示的子查询:

    select  a.line1 StreetAddress1,
                     a.line2 StreetAddress2,
                     a.city City,
                     a.stat_id ST,
                     a.postal Zip
                from co_v_dflt_addr a
                where (a.adty_id in ('LOCL','HOME') and a.name_id = cn.name_id)
    

    被称为“标量子查询”,因为它被键入为SELECT 的“列”。

    Oracle 抱怨此查询返回的不止一行,这是一个错误。当您使用标量子查询时,您必须确保最多有一个返回行,可能通过使用主键或另一个唯一键进行查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多