同一个表上的SQL嵌套查询

时间:2016-03-18 16:28:12

标签: mysql sql nested-queries

我需要选择公司所拥有的每个空间,其面积大于每家公司的平均值。这是我的疑问:

SELECT *
FROM Space outer
WHERE area >
( SELECT AVG (area)
FROM Space inner
WHERE outer.address = inner.address );

MySQL从区域>开始返回语法错误。我知道我不应该使用地址作为主键,而且我不能使用JOIN。这只是一项任务。请帮忙

1 个答案:

答案 0 :(得分:0)

首先得出所有记录的平均空间......

(Select avg(area) mavg from space)

这会返回一个我们可以交叉连接到所有空间记录的值,然后只检查区域>平均。

Select * 
from Space
cross join (Select avg(area) mavg from space) Co
where area > Co.mavg

因为我们知道派生表/内联视图的结果每次只有1个值,所以交叉连接不会增加被计算的行数;并且rdbms只需要评估一次平均值。

但是,假设您希望所有记录的平均值,而不仅仅是整个公司的平均值。如果它是由公司...然后像... ...

Select S.* 
from Space S
LEFT join (Select address, avg(area) mavg from space Group by address) Co
  on S.address= Co.address
where S.area > Co.mavg

这决定了公司加入公司的空间平均值,然后将公司的每个空间记录与公司的平均值进行比较。

由于我们不知道您如何根据数据定义公司,因此我只假设了一个“地址”字段。

一种不同的方法......

Select S.* 
from space S
where S.area > (Select avg(area) from space)

然而,这假定所有公司的平均值

Select S.*
from space
where s.avg > (Select avg(area) from space S2 where S.Company = S2.company)

如果不这样做,我需要查看表空间的DDL(结构列,数据类型PK,FK等)和一些示例数据。

除非每个公司区域的地址相同......必须有一些其他标准将公司与所有其他公司记录(一个名称或一致的密钥?)相关联。

我个人觉得在这种情况下使用相关子查询很慢,因为它必须计算Space中每条记录的平均值。交叉加入IMO会更有效率。