查询联接和计算

时间:2018-11-22 00:24:41

标签: database oracle

我需要根据以下问题创建查询:

我需要添加具有相同邮编的教员和学生的数量,如果大于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个表 学生桌,讲师和邮政编码

1 个答案:

答案 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

相关问题