Я думаю, вы были достаточно близки, но когда вы используете подзапросы, используйте псевдонимы подзапроса и имена / псевдонимы столбцов, предоставленные подзапросом.Например, вы можете использовать псевдоним s.Total_Stud
в последнем предложении where.Вы не можете напрямую ссылаться на таблицу ученика в предложении 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 <> fiddle здесь