我需要选择公司所拥有的每个空间,其面积大于每家公司的平均值。这是我的疑问:
SELECT *
FROM Space outer
WHERE area >
( SELECT AVG (area)
FROM Space inner
WHERE outer.address = inner.address );
MySQL从区域>开始返回语法错误。我知道我不应该使用地址作为主键,而且我不能使用JOIN。这只是一项任务。请帮忙
答案 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会更有效率。