我正在使用PowerSchool(Oracle DB),并且为了导出我们的紧急机器人电话服务,我需要提取一份学生报告以及与他们相关的前7名紧急电话号码。我有一个查询,仅查询紧急电话号码,但在将第n个电话记录提取到正确的上下文时遇到麻烦。运行当前代码时,出现“ ORA-00923:在预期位置找不到FROM关键字”。
我可以在WITH语句中从查询中选择所有值,并且可以按预期运行。但是,我不知道如何在主查询中正确地抓住它们。
WITH emerglist as (
select emergnumbers.stu_dcid,emergnumbers.contact_priority_order,1 as phone_order,emergnumbers.contact_phone_1 as phone_number
from emergnumbers where contact_phone_1 is not null
UNION
select emergnumbers.stu_dcid,2 as phone_order,emergnumbers.contact_phone_2 as phone_number
from emergnumbers where contact_phone_2 is not null
UNION
select emergnumbers.stu_dcid,3 as phone_order,emergnumbers.contact_phone_3 as phone_number
from emergnumbers where contact_phone_3 is not null
)
--select * from emerglist; -- this works
select distinct
s.student_number as referencecode,s.first_name as firstname,s.last_name as lastname,--emergency numbers
(select enum.phone_number from enum where rn=1) as emerg_1
(select enum.phone_number from enum where rn=2) as emerg_2,(select enum.phone_number from enum where rn=3) as emerg_3,(select enum.phone_number from enum where rn=4) as emerg_4,(select enum.phone_number from enum where rn=5) as emerg_5,(select enum.phone_number from enum where rn=6) as emerg_6,(select enum.phone_number from enum where rn=7) as emerg_7
from students s
left outer join ( select emerglist.*,rownum rn from emerglist order by contact_priority_order,phone_order ) enum on s.dcid = enum.stu_dcid
where s.enroll_status=0
;
编辑以添加:我的目标是让每位学生一行,并尽可能多地填写紧急号码栏,没有任何间隔(例如,emerg1 =#,emerg_2 = null,emerg_3 =#) 。每个学生可以有0-10个联系人,每个联系人可以有0-5个号码。每个学生最多只能有7个号码。这是较大查询的子集,该查询还为下雪天,电子邮件地址和其他人口统计信息等正常消息获取主要数字。除紧急电话号码外,所有其他方法均有效。这些仅在真正紧急情况下使用,而我们希望达到尽可能多的数字。
来自EmergList的样本数据:
STU_DCID CONTact_PRIORITY_ORDER PHONE_ORDER PHONE_NUMber
52 1 1 (222) 222-6476
52 2 1 (222) 555-9649
52 2 2 (222) 888-2212
58 1 1 (222) 222-1734
58 1 2 (222) 555-7222
所需结果:
REFERENCECODE FIRSTNAME LASTNAME EMERG_1 EMERG_2 EMERG_3 EMERG_4 EMERG_5 EMERG_6 EMERG_7
52 John Smith (222) 222-6476 (222) 555-9649 (222) 888-2212
58 Mary Jones (222) 222-1734 (222) 555-7222