4
回答
SQL比较弱求解释下这条SQL(子查询)
终于搞明白,存储TCO原来是这样算的>>>   
表Employee:
 1 +----+-------+--------+--------------+
 2 | Id | Name  | Salary | DepartmentId |
 3 +----+-------+--------+--------------+
 4 | 1  | Joe   | 70000  | 1            |
 5 | 2  | Henry | 80000  | 2            |
 6 | 3  | Sam   | 60000  | 2            |
 7 | 4  | Max   | 90000  | 1            |
 8 | 5  | Janet | 69000  | 1            |
 9 | 6  | Randy | 85000  | 1            |
10 +----+-------+--------+--------------+
表Department:
1 +----+----------+
2 | Id | Name     |
3 +----+----------+
4 | 1  | IT       |
5 | 2  | Sales    |
6 +----+----------+
写一段SQL查询各部门收入前三位的员工信息,返回结果如下:
1 +------------+----------+--------+
2 | Department | Employee | Salary |
3 +------------+----------+--------+
4 | IT         | Max      | 90000  |
5 | IT         | Randy    | 85000  |
6 | IT         | Joe      | 70000  |
7 | Sales      | Henry    | 80000  |
8 | Sales      | Sam      | 60000  |
9 +------------+----------+--------+



SELECT
	a. NAME AS Department,
	b. NAME AS Employee,
	b.Salary
FROM
	Department a,
	Employee b
WHERE
	b.DepartmentId = a.Id
AND (
	SELECT
		count(DISTINCT Salary)
	FROM
		Employee
	WHERE
		DepartmentId = a.Id
	AND Salary > b.Salary
) < 3
ORDER BY
	Department



举报
Lewe2010
发帖于1年前 4回/321阅
共有4个答案 最后回答: 1年前

你这个是驱动查询,外层每搜到一条员工信息,传递给内层查询做(...)<3的判断 ,外层查询先执行完搜索到一条学生信息,便将所有信息变量给内层做判断,然后内层依靠这些变量a.Id , b.Salary, 的值进行统计判断,将统计结果和3比较,最后得出的结果后就告知外层搜索到的那条数据是否保留,保留则直接返回给结果集,然后外层继续搜索下一条员工信息,并丢给内层做判断是否保留外层的结果,一直到外层搜索完所有员工信息为止。

--- 共有 2 条评论 ---
Lewe2010回复 @快速开发师 : 为什么用<3呢? 1年前 回复
快速开发师驱动查询一般来说查询完比较慢,但是其可以一边查询一边产生结果集,客户端可以持续地搜到结果集。内部查询每次都要检索,会导致频繁加载表数据,如果内部查询访问的表过大就悲剧了,你会听到你的磁盘在咔咔咔吃吃吃地响。一般建议内部表比较小。这也不是必须,如果是oracle也许会把你看到的这种驱动形式,悄悄地解释成非驱动的hashjoin形式。 1年前 回复
顶部