📜  门| GATE-CS-2015(模拟测试)|问题13

📅  最后修改于: 2021-06-29 05:52:31             🧑  作者: Mango

考虑以下Employee表

ID   salary   DeptName
1    10000      EC
2    40000      EC
3    30000      CS
4    40000      ME
5    50000      ME
6    60000      ME 
7    70000      CS 

以下查询的结果中有多少行?

SELECT E.ID
FROM  Employee E
WHERE  EXISTS  (SELECT E2.salary
               FROM Employee E2
               WHERE E2.DeptName = 'CS'
               AND   E.salary > E2.salary)

(A) 0
(B) 4
(C) 5
(D) 6答案: (C)
说明:背景:

  1. WHERE EXISTS测试子查询中是否存在任何记录。
  2. 如果子查询返回一个或多个记录,则EXISTS返回true。
  3. EXISTS通常与相关子查询一起使用。

在上面的问题中,这里有一个相关的子查询,因为该子查询引用了封闭的查询(关系Employee重命名为E)
子查询( SELECT E2.salary FROM Employee E2
在哪里E2.DeptName =’CS’)
将E2关系过滤为(DeptName为CS的所有元组和相应的薪水)

现在,相关查询的工作方式如下:

选择E.ID
来自员工E
存在的地方(
从雇员E2中选择E2.salary
在哪里E2.DeptName =’CS’
AND E.salary> E2.salary)

如果WHERE EXISTS返回true,即子查询返回一个或多个记录,则它从“员工关系”中获取一个元组并显示其ID。当来自“员工关系E”的元组的“薪水”属性值大于上面过滤出的“薪水”属性值中的任何一个时,就会发生这种情况。
因此,过滤掉的元组将是其薪水属性值大于E2关系中至少一个的薪水值(3000和7000)的所有元组。

身份证薪水DeptName
2 40000 EC
4 40000我
5 50000我
6 60000我
7 70000 CS

最后,它将显示其ID,输出将是:
2个
4
5
6
7

因此,选项(C)5行。

该解决方案由Yashika Arora提供
这个问题的测验