вложенный выбор в MySQL

2

Я изучаю sqlite, используя пример из sqldf, я столкнулся с примером 3 о вложенном select и я не совсем понимаю код:

sqldf("select iris.Species '[Species]',
              avg(Sepal_Length) '[Avg of SLs > avg SL]'
       from iris,
         (select Species, avg(Sepal_Length) SLavg
          from iris group by Species) SLavg
       where iris.Species = SLavg.Species
          and Sepal_Length > SLavg
       group by iris.Species")

Я думаю, что приведенный выше код пытается:

  • создайте таблицу с [Species] и [Avg of SLs > avg SL], используя данные из iris (из строки 1-3)
  • создайте таблицу с именем SLavg с видами и средним значением Sepal_Length для каждого вида из iris (из строки 4-6)

Интересно, почему SLavg присутствует в строке 4-5 в 2 раза, я попытался удалить SLavg, а sqldf дает мне statement: no such column: SLavg и statement: no such column: SLavg.Species.

Теги:

1 ответ

3
Лучший ответ

Код запрашивает два столбца из перекрестного объединения двух таблиц:

select c1,c2 from iris,T2 where .... group by ....

Где T2 - подзапрос, которому дается стенография "SLavg":

select d1, d2 from iris group by ...... // subquery

SLavg используется как для имени подзапроса, так и для имени столбца, и это путает. Пусть дадут им разные имена:

select 
    iris.Species '[Species]', avg(Sepal_Length) '[Avg of SLs > avg SL]'
from 
    iris, 
    (select Species, avg(Sepal_Length) AVGcol from iris group by Species) AVGtbl
where 
    iris.Species = AVGtbl.Species and Sepal_Length > AVGcol
group by 
    iris.Species

Теперь это должно быть более понятным:

  • подзапрос AVGtbl создает два столбца (Species, AVGcol)
  • перекрестное соединение iris и AVGtbl создает четыре столбца (iris.Species, iris.Sepal_Length, AVGtbl.Species, AVGtbl.AVGcol).

Предложение where верхнего уровня select работает с этими четырьмя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню