全面披露:绝对是我学习的新手编码人员。我已经编写了以下选择例程,该例程引发了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
有人可以给菜鸟一个有用的提示吗?我一直在不停地尝试无法使我到达终点的事情。
谢谢
答案 0 :(得分:1)
select语句中的子查询可能返回太多行。当您使用类似的子查询时,它只需要返回一行。
在这种情况下,您应该将表连接到查询的其余部分,如果有可能不返回地址,则使用外部连接。但是,如果它们同时具有“ LOCL”和“ HOME”地址,则会带回两行。该设计选择取决于您。
答案 1 :(得分:0)
根据定义,标量子查询必须最多返回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抱怨此查询返回的行不止一行,这是一个错误。使用标量子查询时,必须确保最多有一个返回的行,也许可以通过使用主键或另一个唯一键进行查询。
答案 2 :(得分:0)
似乎您正在为某种教育实体编写报告。如上所述,设计选择取决于您,但是,我发现我们的教职员工希望在每行学生记录的一行中包含尽可能多的信息。我会推荐以下内容(未经测试的代码,但向您展示了如何连接表并返回结果,即使不存在任何数据而不返回学生的记录)。另外,如上所述,您试图在Scalar子查询中返回多个地址记录,但是对于每个相应的结果集,多个结果不能放入一列中(因为它既返回了本地地址又返回了本地地址,但只有一列要返回放入失败)。这里有一些要检查和尝试的东西(这可能在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