【问题标题】:Query with Join and calculation使用 Join 和计算进行查询
【发布时间】:2019-04-24 14:59:45
【问题描述】:

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

我需要添加具有相同 zip 的教师和学生的数量,如果超过 10 则列出城市、州、教师总数、学生总数以及添加教师和学生的总数学生在一起。 所有三个表都有它们共享的 zip 字段。它是邮政编码表中的主键,也是教师和学生表中的外键。城市和州字段位于邮政编码表中。我最初有这个查询,但没有返回任何行。我无法得到总数。每次我合并 SUM 或加法时,我都会收到 ORA 00923 From keyword not found where expected 错误。

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 个表 学生表、教师和邮政编码

【问题讨论】:

标签: database oracle


【解决方案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,因此我使用了 @ 987654325@ 函数将 NULL 替换为零。可以使用COALESCE() 代替NVL()

最后还要注意,在 Oracle 中,您希望避免使用带引号的列名/别名,如果这样做,它们会变得“区分大小写”并且使用起来非常痛苦。 (因此,这也意味着避免列名/别名中的空格。)

有关演示,请参阅 dbfiddle here

【讨论】:

  • 我运行了您的查询,没有任何错误。只有没有返回行
  • 抱歉,请刷新并尝试最新查询。我一直试图在没有键盘的情况下回答,现在我面前有一个我可以做更多的事情。也尝试删除 where 子句,我看不到你的数据,所以不知道你看到的结果是什么。
  • 仍然没有返回行
  • 输出应该是 5 列
  • 我已经回答了这个问题。您现在正在努力解决与 DATA 相关的问题,而我无法控制...我再说一遍,我看不到任何数据。 在任何情况下都尝试将数据放入这些 cmets 之一。如果您要添加数据,请编辑问题(提供了一个链接)
猜你喜欢
  • 2019-01-29
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
相关资源
最近更新 更多