我想在子查询中执行order by
,然后在主查询上执行distinct on
,但为什么排序被删除或重置。实际上,如果我只在同一级别上select
和distinct on
进行一次order by
语句,它应该按照我的意愿降序。我想了解为什么我distinct on
喜欢下面的查询,它将被排除。
查询:
select distinct on (id) * from (
select * from products
left outer join product_descriptions on product_descriptions.product_id = products.id
order by id desc) as A
结果:
id product_name price
1 Navy Floral Embroidery Bomber Jacket 1390
2 Black Floral Embroidery Bomber Jacket 1390
3 Blue Wandy Blouse 750
4 White Adele Pants 1790
5 White Wandy Blouse 750
6 Black Wandy Blouse 750
7 Navy Adele Pants 1790
我有一个问题,因为我试图将distinct on
移动到order by
的差异级别,因为我尝试的速度更快,但排序将被取消。我正在从这个查询中解决一个非常慢的查询问题。
with recursive categ_all as
(
select *, id as root_category,array_append(null,id) as category_path
from categories
where parent_id is null
union all
select c.*, p.root_category,array_append(p.category_path,c.id)
from categories c
join categ_all p on c.parent_id[1] = p.id
)
select * from products as p
left outer join categ_all on categ_all.id = ANY (p.category_ids)
order by p.created_at limit 20
当我删除order by
或删除left outer join
数组时,我看到了这一点。它会更快,但我仍然需要使用数组。
谢谢你的建议。
答案 0 :(得分:2)
您不需要子查询:
select distinct on (p.id) *
from products p join
product_descriptions pd
on p.id = pd.product_id
order by p.id;
通常,您不应该依赖子查询中的顺序来完成您想要的任务。您应该在与distinct on
相同的级别上进行显式排序。
我还建议您对所有列引用使用限定列名。您可能还需要order by
的第二个密钥,以指定您想要的产品说明。