вложенный выбор в MySQL - PullRequest
       6

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

2 голосов
/ 16 августа 2011

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

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 два раза, я попытался удалитьSLavg и sqldf дает мне statement: no such column: SLavg и statement: no such column: SLavg.Species.

1 Ответ

3 голосов
/ 16 августа 2011

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

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 оперирует этими четырьмя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...