Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 带连接和计算的查询_Database_Oracle - Fatal编程技术网

Database 带连接和计算的查询

Database 带连接和计算的查询,database,oracle,Database,Oracle,我需要根据以下问题创建一个查询: 我需要添加具有相同zip的教师和学生的数量,如果超过10,则列出城市、州、教师总数、学生总数,以及将教师和学生相加的总数。 这三个表都有它们共享的zip字段。它是zipcode表中的主键,也是讲师和学生表中的外键。城市和州字段位于zipcode表中。我最初有这个查询,但没有返回任何行。我不能得到总数。每次我合并总和或加法,我都会从关键字notfoundwhere中得到一个ORA 00923预期错误 select city, state, 'TOTAL' from

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

我需要添加具有相同zip的教师和学生的数量,如果超过10,则列出城市、州、教师总数、学生总数,以及将教师和学生相加的总数。 这三个表都有它们共享的zip字段。它是zipcode表中的主键,也是讲师和学生表中的外键。城市和州字段位于zipcode表中。我最初有这个查询,但没有返回任何行。我不能得到总数。每次我合并总和或加法,我都会从关键字notfoundwhere中得到一个ORA 00923预期错误

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个表
Student Table、讲师和zipcode

我认为您非常接近,但是当您使用子查询时,请使用子查询的别名以及子查询提供的列名/别名。例如,您可以在最后的where子句中使用别名
s.Total\u Stud
。不能直接引用where子句中的student表,因为该表仅在称为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;
请注意,由于每个
左连接都可能导致不匹配的行(例如,一个没有学生的城市),那么学生或教师的计数可能会缺失,因此在将这些计数相加时,我们必须避免NULL,因此我使用
NVL()
函数将NULL替换为零<可以使用code>COALESCE()
代替
NVL()

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


有关演示,请参见dbfiddle

我运行了您的查询,没有出现错误。仅未返回行抱歉,请刷新并尝试最新查询。我一直试图在没有键盘的情况下回答问题,现在我面前有一个键盘,我可以做得更多。另外,请尝试删除where子句,我看不到您的数据,因此不知道您看到的结果是什么。仍然没有返回任何行。输出应为5列。我已经回答了问题。你现在正在处理与数据相关的问题,而我无法控制这些问题。。。我重复一遍,我看不到任何数据。在任何情况下,都不要试图将数据放入这些评论中。如果要添加数据,请在下一个问题之前编辑问题(提供了相关链接),我建议您阅读以下内容:和