如果数据表是以下
Name cgpa dept
a 4.0 x
b 3.9 x
c 3.8 x
d 3.8 y
e 4.0 y
f 3.9 z
g 3.6 z
选择那些cgpa高于同一部门所有其他学生的学生的姓名和cgpa:
select NAME, CGPA
from STD_INFO T1
where CGPA > all
(
select CGPA
from STD_INFO T2
where lower(T2.DEPT)=lower(T1.DEPT)
and T2.STD_NO != T1.STD_NO
);
我需要了解完整的模拟.....请帮助我....当我们比较上面的相同表格命名(t1,t2)时它叫什么?
答案 0 :(得分:0)
您希望找到max(CGPA)
的{{1}} DEPT
和inner join
数据集到您的STD_INFO
表:
select s1.NAME,s1.CGPA
from STD_INFO as s1
inner join (select DEPT,max(CGPA) as CGPA
from STD_INFO
group by DEPT) as s2
on s2.DEPT = s1.DEPT
and s2.CGPA = s1.CGPA;
答案 1 :(得分:0)
循环遍历表std_info中的所有记录,您调用t1。对于每条记录,检查它们的cgpa是否大于子查询中选择的所有cgpas。
在子查询中,您再次从表std_info中选择,此次调用t2。因此,使用一个t1记录,您可以从具有相同部门(lower(T2.DEPT)=lower(T1.DEPT)
)的表格中选择所有记录,但选择另一个学生编号(T2.STD_NO != T1.STD_NO
)。
如果该部门的所有其他学生的cgpa低于您当前正在查看的学生,那么您将该学生留在结果列表中,否则将其从中删除。
因此,在检查了所有学生之后,您仍然保留那些cgpa高于同一部门所有其他学生的学生。
唯一的名字"我能想到的是:这是同一个表上的相关子查询。
使用>所有(或某些或任何此类事件)非常罕见。大多数情况下,您使用EXISTS或IN代替:
select NAME, CGPA
from STD_INFO T1
where not exists
(
select *
from STD_INFO T2
where lower(T2.DEPT)=lower(T1.DEPT)
and T2.STD_NO != T1.STD_NO
and T2.CGPA >= T1.CGPA
);
答案 2 :(得分:0)
选择那些cgpa高于同一部门所有其他学生的学生的姓名和cgpa:
如果两名学生拥有相同的GPA,则必须同时显示两个记录,否则系统将不知道要显示哪个名称,因为他们都是他们部门的“顶级”。就像在这个例子中一样:
Name cgpa dept
a 4.0 x
b 4.0 x
r 3.1 x
c 3.8 y
e 3.5 y
d 3.9 z
此查询:
SELECT t.* FROM table AS t
INNER JOIN (
SELECT MAX(cgpa) AS 'cgpa',dept FROM table AS t2
GROUP BY dept) AS innerTable
ON innerTable.cgpa = t.cgpa AND innerTable.dept = t.dept
将返回此:
Name cgpa dept
a 4 x
b 4 x
c 3.8 y
d 3.9 z
这里的答案与此非常相似:How do you group by one column and retrieve a row with the minimum value of another column in T/SQL?