请解释这个嵌套查询

时间:2015-03-14 03:16:09

标签: sql sql-server

SELECT  name  
FROM EMPLOYEE o 
WHERE 
   (SELECT count(*) 
    FROM EMPLOYEE i 
    WHERE i.name < o.name) < 5

这给出了表格中的前5条记录。请解释一下。

2 个答案:

答案 0 :(得分:1)

一旦理解了表别名,您的查询就变得不言自明了:

SELECT name
FROM EMPLOYEE o     -- <<== Alias #1
WHERE (
    SELECT count(*)
    FROM EMPLOYEE i -- <<== Alias #2
    WHERE i.name < o.name) < 5

您的查询为同一EMPLOYEE表定义了两个别名。

内部查询计算员工姓名i(内部)是多少&#34;提前&#34;员工o(外部)。如果当前员工姓名的数量小于5,则该名称将作为查询结果返回。

请注意,如果表中的顶级名称之间存在重复项,则查询返回的行数可能会高于5。

答案 1 :(得分:1)

此查询没有意义,也没有选择“前5条记录”;它将根据相关子查询选择符合条件的所有行。

子查询与外部表引用相关联。对于表中的每一行,子查询计算名称小于外部引用的雇员数。谓词“小于5”应用于外表上每行的结果计数。仅当少于5个名称小于当前名称的员工时才返回外部行。

如果您有一个包含4行名称为“Jane”的表和100行名称为“John”的行,您将获得返回的所有100个“John”行,因为子查询将为每个“Jane”行返回0并且4对于每个“John”行。