2017-11-11 12 views
1

サブクエリを追加して以来、以下のクエリは永遠に実行されているようです。選択クエリをより効率的にする(サブクエリは実行速度を遅くする)

私はもともと2つの結合を持つことで目標を達成しようとしましたが、結果は間違っていました。

これを書く正しい方法を知っている人はいますか?カウントが非常に間接的グルーピングに関連しているので、奇妙

Example Data of order header and order totals

+1

[DBMS](https://en.wikipedia.org/wiki/DBMS)製品はどちらを使用していますか? Postgres?オラクル? "_SQL_"はクエリ言語であり、特定のデータベース製品の名前ではありません。 –

+0

私は一時テーブルにサブクエリを入れて、それを他のテーブルに結合します – Sarhang

答えて

1

で副選択を置き換えることができますあなたが望むデータについては、これが行く方法だと思います:

SELECT c.cus_Name, 
     COUNT(o.orderHeader_id) AS Orders, 
     SUM(ol.cnt) as linesOrderd, 
     MAX(o.orderHeader_dateCreated) AS lastOrdered, 
     SUM(o.orderHeader_totalSell) AS orderTotal, 
     SUM(o.orderHeader_currentSell) AS sellTotal 
FROM cus c JOIN 
    orderheader o 
    ON o.orderHeader_customer = c.cus_id LEFT JOIN 
    (SELECT ol.orderLines_orderId, count(*) as cnt 
     FROM orderlines ol 
     GROUP BY ol.orderLines_orderId 
    ) ol 
    ON ol.orderLines_orderId = o.orderHeader_id) 
GROUP BY c.cus_name 
ORDER BY orderTotal DESC; 

私はそれがはるかに速くなりますが、それは、少なくとも賢明な結果を生成するかどうかはわからない - 顧客の注文明細行の合計数ではなく、注文明細行の数、任意の順序で。

+0

これは完全に動作します。この結合とサブクエリがどのように機能しているかについてもっと知る必要があります。 (私は以前のクエリが間違った結果を出していたことに気付いていませんでした)ありがとう –

1

以下

SELECT 
    c.cus_Name, 
    COUNT(o.orderHeader_id) AS Orders, 
    (select count(ol.orderLines_id) from orderlines ol where ol.orderLines_orderId = o.orderHeader_id) as linesOrderd, 
    MAX(o.orderHeader_dateCreated) AS lastOrdered, 
    SUM(o.orderHeader_totalSell) AS orderTotal, 
    SUM(o.orderHeader_currentSell) AS sellTotal 
FROM 
    cus c 
     JOIN 
    orderheader o ON o.orderHeader_customer = c.cus_id 
group by 
    c.cus_name 
order by 
    orderTotal desc 

例のデータは、副選択が可能であってはならないこと。あなたは1人の顧客に関連するすべての注文のすべての注文ラインを数えたいと思っていますか?通常、これは2番目の結合を使用して実行する必要がありますが、order_linesが存在するかぎり頻繁にorderheaderが繰り返されます。それは他の集計で間違った結果を生みます。

通常、これは、その後、助けて結合されたテーブルに副選択を置く必要があります。

あなたは

(select o.*, (select count(ol.orderLines_id) from orderlines ol where ol.orderLines_orderId = o.orderHeader_id) as linesOrder from orderheader o) as o

orderheader oを交換し、

sum(o.linesOrder)

関連する問題