Я изучаю 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
.
Код запрашивает два столбца из перекрестного объединения двух таблиц:
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
работает с этими четырьмя.