2016-03-18 4 views
1

Мне нужно выбрать каждое пространство, в котором находится компания, где ее площадь больше, чем средняя для каждой компании. Вот мой запрос:SQL Вложенный запрос в ту же таблицу

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

MySQL возвращает ошибку синтаксиса, начиная с области>. Я знаю, что не должен был использовать адрес в качестве первичного ключа, и я не могу использовать JOIN. Это просто задание. Пожалуйста, помогите

+0

Используйте полные имена столбцов, чтобы избежать двусмысленности: 'WHERE outer.area' и' AVG (inner.area) ' –

+0

Так что есть одно среднее или среднее значение для одной компании .... но мы не знаем, как определить компанию? – xQbert

ответ

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 и т. д.) и некоторые примеры данных.

, если адрес не является одинаковым для каждой области компании .... есть должны быть какие-то другие критерии относятся компании ко всем другим записям компании (название, возможно, или последовательный ключ?)

Лично я считаю, использование коррелированного подзапроса в этом случае медленное, поскольку оно должно вычислять среднее значение для каждой записи в пространстве. Перекрестное присоединение к ИМО будет более эффективным.

+0

Спасибо, @xQbert, но моя задача требует вложенного запроса no-JOINS. Я вижу, вы эксперт по SQL, можете ли вы сказать мне, если это возможно? –

+0

Спасибо @xQbert, я отвечу на ваш ответ, так как он правильный и исчерпывающий. Это не решило мою проблему, но единственная причина, по которой я вижу, - это недостаток задачи, поэтому мне нужно будет обсудить это со своим колледжем. Благодарю. –

+0

, если это не помогло не маркировать его правильно. другие могут предлагать разные подходы. – xQbert