“DISTINCT”在子查询中被删除“ORDER BY”,“ORDER BY”也很慢

时间:2017-12-14 13:33:30

标签: sql postgresql

我想在子查询中执行order by,然后在主查询上执行distinct on,但为什么排序被删除或重置。实际上,如果我只在同一级别上selectdistinct 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数组时,我看到了这一点。它会更快,但我仍然需要使用数组。 谢谢你的建议。

1 个答案:

答案 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的第二个密钥,以指定您想要的产品说明。