比较sql嵌套查询中的相同表

时间:2015-02-05 15:19:36

标签: mysql sql

如果数据表是以下

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)时它叫什么?

3 个答案:

答案 0 :(得分:0)

您希望找到max(CGPA)的{​​{1}} DEPTinner 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;

SQL FIDDLE

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