Бывают случаи, когда мы хотим сделать условие со сравнением с несколькими значениями из подзапроса. Это тот случай, когда, условие гласит: column1
должна быть больше, чем значения из подзапроса. Так, мы используем операторы ALL
, SOME
или ANY
перед открывающей скобкой подзапроса:
select
column1,
column2
from
table1
where column1 > any(select column3 from table2 )
All
- условие должно быть верно для всех значений.ANY
и SOME
- условие должно быть верно хотя бы для одного значения из подзапроса.Также из примера мы увидели, что подзапрос в условии никогда не возвращает несколько колонок, потому что мы сравниваем одно значение с результатом из подзапроса. Если вы хотите сравнить два значения, тогда нужно писать JOIN
.
После подзапроса в условии не ставится алиас.
Даже если мы создали CTE
и хотим использовать его в условии, нет возможности просто написать CTE
в условии, как в FROM
. Нужно всегда писать подзапрос:
with cte as
(select column1 from table1)
select
*
from table2
where column2 > cte;
Так нельзя! Нужно вот так:
with cte as
(select column1 from table1)
select
*
from table2
where column2 > (select column1 from cte)
Рассмотрим пример, где мы можем использовать подзапрос в условии.
Вернемся к нашей задаче с 5 лучшими футболистами из команды, которая имеет наиболее высокий средний рейтинг:
with cte as (
select
club,
avg(overall) as avg_overall
from
fifa_players_2018
group by
club
order by
avg_overall desc
limit 1
)
select
club,
short_name,
overall
from
fifa_players_2018 as players
where club = (select club from cte)
order by
overall desc
limit 5
Мы просто вывели 5 лучших футболистов клуба, что мы отфильтровали с помощью подзапроса CTE
.
Это решение изящнее и проще, чем решение с использованием JOIN
, однако у него есть недостаток. Мы не смогли вывести рейтинг клуб в конечный SELECT
.
И это подводит нас к следующей теме.