Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 同一表上的SQL嵌套查询_Mysql_Sql_Nested Queries - Fatal编程技术网

Mysql 同一表上的SQL嵌套查询

Mysql 同一表上的SQL嵌套查询,mysql,sql,nested-queries,Mysql,Sql,Nested Queries,我需要选择一家公司拥有的每一个面积大于每家公司平均面积的空间。我的问题是: SELECT * FROM Space outer WHERE area > ( SELECT AVG (area) FROM Space inner WHERE outer.address = inner.address ); MySQL返回从area>开始的语法错误。我知道我不应该用地址作为主键,也不能用JOIN。这只是一项任务。请帮助首先导出所有记录的平均空间 (Select avg(area) mavg

我需要选择一家公司拥有的每一个面积大于每家公司平均面积的空间。我的问题是:

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

MySQL返回从area>开始的语法错误。我知道我不应该用地址作为主键,也不能用JOIN。这只是一项任务。请帮助

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

(Select avg(area) mavg from space)
这将返回一个值,我们可以交叉连接到所有空间记录,然后只检查area>average

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)
然而,这假设所有公司的平均值

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

除非每个公司区域的地址都相同。。。。必须有其他一些标准才能将一家公司与所有其他公司记录联系起来(可能是名称还是一致的密钥?)


就我个人而言,我发现在这种情况下使用相关子查询很慢,因为它必须计算空间中每个记录的平均值。交叉连接IMO将更有效。

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

(Select avg(area) mavg from space)
这将返回一个值,我们可以交叉连接到所有空间记录,然后只检查area>average

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)
然而,这假设所有公司的平均值

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

除非每个公司区域的地址都相同。。。。必须有其他一些标准才能将一家公司与所有其他公司记录联系起来(可能是名称还是一致的密钥?)


就我个人而言,我发现在这种情况下使用相关子查询很慢,因为它必须计算空间中每个记录的平均值。交叉连接IMO将更有效。

使用完全限定的列名以避免歧义:
其中外部.area
平均值(内部.area)
因此每个公司是否有一个平均值或平均值。。。。然而,我们不知道如何定义公司?使用完全限定的列名以避免歧义:
WHERE outer.area
AVG(inner.area)
那么每个公司是否有一个AVG或平均值。。。。然而我们不知道如何定义公司?谢谢,@xQbert,但我的任务需要一个无连接嵌套查询。我明白了,你是一位SQL专家,你能告诉我这是否可行吗?谢谢@xQbert,我会将你的答案标记为已回答,因为它是正确的、详尽的。这并没有解决我的问题,但我看到的唯一原因是任务缺陷,所以我需要和我的大学工作人员讨论。谢谢。如果没有用,就不要把它标对。其他人可能会提供不同的方法。谢谢,@xQbert,但我的任务需要一个无连接嵌套查询。我明白了,你是一位SQL专家,你能告诉我这是否可行吗?谢谢@xQbert,我会将你的答案标记为已回答,因为它是正确的、详尽的。这并没有解决我的问题,但我看到的唯一原因是任务缺陷,所以我需要和我的大学工作人员讨论。谢谢。如果没有用,就不要把它标对。其他人可能会提供不同的方法。