2017-12-14 3 views
-1

サブクエリでorder byを実行したいのですが、代わりにメインクエリでdistinct onを実行します。実際には同じレベルのdistinct onorder byという文が1つしかない場合は、私が望むように降順でなければなりません。私は理由を理解したいのですが、distinct onはその下のクエリが好きなので、注文を削除します。"DISTINCT"はサブクエリで "ORDER BY"が削除され、 "ORDER BY"もスローです

クエリ:

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 

私はorder byの差異レベルにdistinct onを移動しようとしていますので、それは私がしようとしたとして、高速ですが、順序がなりますので、私は疑問を持っています削除されました。私はこのクエリから非常に遅いクエリの問題を解決しています。

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を削除する場合がわかります。それは高速ですが、私はまだ配列を使用する必要があります。 ありがとうございました。あなたが望むものを達成するためにサブクエリの中に発注に依存してはならない、一般的には

select distinct on (p.id) * 
from products p join 
    product_descriptions pd 
    on p.id = pd.product_id 
order by p.id; 

+3

内側の代わりに外側のクエリで注文してください。 –

+4

サンプルテーブルのデータと予想される結果をフォーマット済みのテキスト(画像や画像へのリンクではありません)として追加してください。 – jarlh

+2

現在のクエリの試行も表示してください。 – jarlh

答えて

2

あなたはこのためにサブクエリを必要としません。明示的な注文は、distinct onと同じレベルで行う必要があります。

また、すべての列参照に修飾列名を使用することをお勧めします。 order byの2番目のキーを指定して、を指定すると、の商品説明が必要になる場合があります。

+0

ありがとうございます。私はより多くの情報を追加しました。助けてください。 – Armmydev

+0

ありがとうございました。「any」操作ではなく「unnest」を使用して解決策を見つけました。それはさらにいいです。 – Armmydev