2016-08-10 6 views
-1

"Transaction"テーブルがあります。SQLサブクエリを使用してSUMを選択するのが遅すぎる

トランザクションは複数の "TransactionProduct"を持つことができます。

トランザクション製品には、複数の「PriceModifiers」を含めることができます。

私は、すべての取引商品を価格修正の合計(還元額)で返すクエリを持っています。

クエリ:

SELECT 
    TRANSACTION.DESCRIPTION, 
    TRANSACTIONPRODUCT.PRODUCTNAME, 
    TRANSACTIONPRODUCT.EFFECTIVEPRICE, 
    (
     SELECT SUM(AMOUNT) 
     FROM PRICEMODIFIER 
     WHERE TRANSACTIONPRODUCTID = TRANSACTIONPRODUCT.TRANSACTIONPRODUCTID 
    ) 
    AS REDUCTIONAMOUNT 
FROM 
    TRANSACTION, 
    TRANSACTIONPRODUCT 
WHERE 
    TRANSACTION.TRANSACTIONID = TRANSACTIONPRODUCT.TRANSACTIONID 

私は合計でサブクエリを削除した場合、クエリを実行するのは非常に高速です。サブクエリで

、それは私がクエリをどのように改善できるか

任意のアイデア...数秒かかりますか?

+1

。インデックスはありますか? –

+2

80年代の恐怖の復讐? 1)JOIN構文2)テーブル別名3)FULLCAPS 4)スカラーサブクエリ5) "transaction"は予約語/キーワードです。テーブル/列名 – wildplasser

+0

には、with句としてsumサブセレクションを含め、idを含めてidを追加し、各ローのサブクエリを作成するのではなく、idで結合します。 – SomeJavaGuy

答えて

1

はこれを試してください:あなたは、インデックスを追加することができ

SELECT 
    T.DESCRIPTION, 
    TP.PRODUCTNAME, 
    TP.EFFECTIVEPRICE, 
    SUM(PM.AMOUNT) 
FROM 
    TRANSACTION T 
JOIN TRANSACTIONPRODUCT TP 
    ON T.TRANSACTIONID = TP.TRANSACTIONID 
JOIN PRICEMODIFIER PM 
    ON PM.TRANSACTIONPRODUCTID = TP.TRANSACTIONPRODUCTID 
GROUP BY T.DESCRIPTION, TP.PRODUCTNAME, TP.EFFECTIVEPRICE 
+0

ありがとうございます、うまくいきます。 – user3544117

3

適切な明示的なJOIN構文を使用することを学ぶ必要があります。単純なルール:は、FROM句にカンマを使用します。 常には、適切なJOIN構文を使用します。

しかし、これはパフォーマンスの問題とは関係ありません。そのためには、PRICEMODIER(TRANSACTIONPRODUCTID, AMOUNT)のインデックスが必要です。

関連する問題