将子查询转换为 Join (MySQL)
Converting subquery to Join (MySQL)
是否可以将这些子查询转换为连接子句?
SELECT ods.*,
(SELECT COUNT(*) FROM orders) tot_ords,
(SELECT COUNT(*) FROM orders WHERE order_confirmed = 'yes') yes_ords,
(SELECT COUNT(*) FROM orders WHERE order_confirmed = 'no') no_ords
FROM orders ods
ORDER BY ods.order_confirmed = 'yes' DESC
没有连接也没有子查询,使用分析:
SELECT ods.*,
COUNT(*) OVER() tot_ords,
COUNT(case when order_confirmed = 'yes' then 1 else null end) OVER() yes_ords,
COUNT(case when order_confirmed = 'no' then 1 else null end) OVER() no_ords
FROM orders ods
ORDER BY ods.order_confirmed = 'yes' DESC
使用连接:
SELECT ods.*,
s.tot_ords,
s.yes_ords,
s.no_ords
FROM orders ods
cross join (select
COUNT(*) tot_ords,
COUNT(case when order_confirmed = 'yes' then 1 else null end) yes_ords,
COUNT(case when order_confirmed = 'no' then 1 else null end) no_ords
from orders
) s
ORDER BY ods.order_confirmed = 'yes' DESC
你可以简单地使用条件聚合,
select *, Count(*) over() tot_ords,
Sum(case when order_confirmed ='yes' then 1 else 0 end) over() yes_ords,
Sum(case when order_confirmed ='no' then 1 else 0 end) over() no_ords
from orders
from orders ods
order by ods.order_confirmed = 'yes' DESC
是否可以将这些子查询转换为连接子句?
SELECT ods.*,
(SELECT COUNT(*) FROM orders) tot_ords,
(SELECT COUNT(*) FROM orders WHERE order_confirmed = 'yes') yes_ords,
(SELECT COUNT(*) FROM orders WHERE order_confirmed = 'no') no_ords
FROM orders ods
ORDER BY ods.order_confirmed = 'yes' DESC
没有连接也没有子查询,使用分析:
SELECT ods.*,
COUNT(*) OVER() tot_ords,
COUNT(case when order_confirmed = 'yes' then 1 else null end) OVER() yes_ords,
COUNT(case when order_confirmed = 'no' then 1 else null end) OVER() no_ords
FROM orders ods
ORDER BY ods.order_confirmed = 'yes' DESC
使用连接:
SELECT ods.*,
s.tot_ords,
s.yes_ords,
s.no_ords
FROM orders ods
cross join (select
COUNT(*) tot_ords,
COUNT(case when order_confirmed = 'yes' then 1 else null end) yes_ords,
COUNT(case when order_confirmed = 'no' then 1 else null end) no_ords
from orders
) s
ORDER BY ods.order_confirmed = 'yes' DESC
你可以简单地使用条件聚合,
select *, Count(*) over() tot_ords,
Sum(case when order_confirmed ='yes' then 1 else 0 end) over() yes_ords,
Sum(case when order_confirmed ='no' then 1 else 0 end) over() no_ords
from orders
from orders ods
order by ods.order_confirmed = 'yes' DESC