サブクエリを追加して以来、以下のクエリは永遠に実行されているようです。選択クエリをより効率的にする(サブクエリは実行速度を遅くする)
私はもともと2つの結合を持つことで目標を達成しようとしましたが、結果は間違っていました。
これを書く正しい方法を知っている人はいますか?カウントが非常に間接的グルーピングに関連しているので、奇妙
サブクエリを追加して以来、以下のクエリは永遠に実行されているようです。選択クエリをより効率的にする(サブクエリは実行速度を遅くする)
私はもともと2つの結合を持つことで目標を達成しようとしましたが、結果は間違っていました。
これを書く正しい方法を知っている人はいますか?カウントが非常に間接的グルーピングに関連しているので、奇妙
で副選択を置き換えることができますあなたが望むデータについては、これが行く方法だと思います:
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;
私はそれがはるかに速くなりますが、それは、少なくとも賢明な結果を生成するかどうかはわからない - 顧客の注文明細行の合計数ではなく、注文明細行の数、任意の順序で。
これは完全に動作します。この結合とサブクエリがどのように機能しているかについてもっと知る必要があります。 (私は以前のクエリが間違った結果を出していたことに気付いていませんでした)ありがとう –
以下
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)
[DBMS](https://en.wikipedia.org/wiki/DBMS)製品はどちらを使用していますか? Postgres?オラクル? "_SQL_"はクエリ言語であり、特定のデータベース製品の名前ではありません。 –
私は一時テーブルにサブクエリを入れて、それを他のテーブルに結合します – Sarhang