SELECT name
FROM EMPLOYEE o
WHERE
(SELECT count(*)
FROM EMPLOYEE i
WHERE i.name < o.name) < 5
这给出了表格中的前5条记录。请解释一下。
答案 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”行。