1

私は3つのテーブルを持っています:

  • order
  • orderline(持っているorderID
  • orderactions(持っているorderID

それから私は必要SUM(of orderline.price)としSUM(of orderactions.price)ますorderID

私が使用したとき:

    SELECT order.ID, SUM(orderlines.price), SUM(orderactions.price) 
    FROM order 
    LEFT JOIN orderlines ON orderlines.orderID=order.ID
    LEFT JOIN orderactions ON orderactions.orderID=order.ID
    WHERE order.ID=@orderID
    GROUP BY order.ID

このorder.IDのorderlinesにorderactions相当する結果が得られました。SUM(orderactions.price)*quantity

私が見つけた唯一の解決策は、正しい結果をもたらし、すべての「SUM」テーブルのサブクエリです。

SELECT order.ID
, (SELECT SUM(orderlines.price) FROM orderlines WHERE orderlines.orderId=order.ID)
, (SELECT SUM(orderactions.price) FROM orderactions WHERE orderactions.orderId=order.ID)
FROM order
WHERE order.ID=@orderID

質問:サブクエリは遅く、使用しないようにしているため、これに対する他の(より高速な)解決策はありますか?

4

2 に答える 2

1

selectは2つの非常に単純なサブクエリをそれぞれ1回だけ実行するので、クエリにかなり近いと思います。JOINクエリが何らかの方法で相関していない限り、を追加する必要はありません。

サブクエリの遅い部分は、通常、データベースが(クエリの記述方法に注意しないと)明らかにサブクエリを複数回実行しない可能性があることです。これは通常、行ごとに変更される可能性のある外部値に依存している場合、つまりJOIN何らかの方法で変更された場合に発生します。

サブクエリは非常に単純で、定数以外の外部値を使用しないため、この場合、サブクエリはそれぞれ1回だけ実行され、。を追加することで簡略化されるものはありませんJOIN

于 2012-10-08T18:00:57.647 に答える
1

この方法はデータに依存しますが、解決策になる可能性があります。

    SELECT order.ID, 
    SUM(CASE WHEN orderlines.orderID IS NOT NULL THEN orderlines.price ELSE 0 END), 
    SUM(CASE WHEN orderactions.orderID IS NOT NULL THEN orderactions.price ELSE 0 END) 
FROM order 
LEFT JOIN orderlines ON orderlines.orderID=order.ID
LEFT JOIN orderactions ON orderactions.orderID=order.ID
WHERE order.ID=@orderID
GROUP BY order.ID
于 2012-10-08T18:23:04.737 に答える