我需要根据以下问题创建查询:
我需要添加具有相同邮编的教员和学生的数量,如果大于10,则列出城市,州,教员总数,学生总数以及通过添加教员和学生在一起。 这三个表均具有它们共享的zip字段。它是邮政编码表中的主键,是教师和学生表中的外键。城市和州字段在邮政编码表中。我最初有此查询,但没有返回任何行。我无法得到总数。每次合并SUM或加法运算时,都会得到ORA 00923 From关键字,找不到预期的错误。
select city, state, 'TOTAL'
from zipcode
left join
(select student.zip, count(*) 'Total_Stud'
from student
group by zip)
s on zipcode.zip=student.zip
left join
(select instructor.zip, count(*) 'Total_Inst'
from instructor
group by zip)
i on zipcode.zip=instructor.zip
where count(student.student_id) + count(instructor.instructor_id)>=10 as total
order by total desc;
涉及3个表 学生桌,讲师和邮政编码
答案 0 :(得分:1)
我认为您已经很接近了,但是当您使用子查询时,请使用子查询的别名以及子查询提供的列名/别名。例如。您可以在最后的where子句中使用别名s.Total_Stud
。您不能在where子句中直接引用学生表,因为它仅在称为s的子查询中可用。我可以在下面尝试将其称为子查询的“作用域”。
select zipcode.city, zipcode.state, (NVL(s.Total_Stud,0) + NVL(i.Total_Inst,0)) TOTAL
from zipcode
left join (
-- -------------- scope ------------------- -- student
select student.zip, count(*) Total_Stud -- student
from student -- student
group by zip -- student
-- -------------- scope ------------------- -- student
) s on zipcode.zip=s.zip
left join (
-- ------------- scope -------------------- -- instructor
select instructor.zip, count(*) Total_Inst -- instructor
from instructor -- instructor
group by zip -- instructor
-- ------------ scope --------------------- -- instructor
)
i on zipcode.zip=i.zip
where (NVL(s.Total_Stud,0) + NVL(i.Total_Inst,0)) >=10
order by (NVL(s.Total_Stud,0) + NVL(i.Total_Inst,0)) desc, zipcode.city;
请注意,由于每个left join
都可能导致不匹配的行(例如,一个没有学生的城市),因此可能缺少学生或讲师的人数,因此将它们加在一起时,我们必须避免NULL,因此我使用了NVL()
函数将NULL替换为零。可以使用COALESCE()
代替NVL()
最后还要注意,在Oracle中,您要避免使用带引号的列名/别名,如果这样做,它们将变成“区分大小写”,并且使用起来非常麻烦。 (因此,这也意味着避免在列名/别名中使用空格。)
有关演示,请参见 db <>小提琴here