3

私は Microsoft SQL Server を使用していますが、この質問はすべての SQL 言語に当てはまると思います。もしわたしが持っていたら:

SELECT OrderHeaderID
    ,isNull(Qty,0) AS Qty
FROM OrderHeader
LEFT JOIN (
    SELECT OrderHeaderID
    ,Sum(Qty) AS Qty
    FROM OrderDetail
    GROUP BY OrderHeaderID
) OrderDetail
ON OrderDetail.OrderHeaderID = OrderHeader.OrderHeaderID
WHERE Criteria = 'X'

次に、条件が適用される前に、すべての OrderDetail 行で GROUP BY が実行されますか? つまり、外部の SELECT だけでなく GROUP BY にも条件を適用するように注意する必要がありますか?

ところで、このコード行に改善が見られた場合は、コメントしてください。

4

3 に答える 3

3

最初の質問に関しては、クエリのコンパイル中にオプティマイザが何を見つけたかを伝えるのは困難です。内部集計が最初に実行されると思います。

2番目の質問については、これら2つの選択肢の方が理解しやすいかもしれません

SELECT OrderHeader.OrderHeaderID
      ,isNull(Sum(OrderDetail.Qty),0) AS Qty
 FROM OrderHeader
      LEFT JOIN OrderDetail
        ON OrderDetail.OrderHeaderID = OrderHeader.OrderHeaderID
WHERE OrderHeader.Criteria = 'X'
GROUP BY OrderHeader.OrderHeaderID

また

select OrderHeaderId,
       IsNull(
         (Select sum(qty) from OrderDetails d 
           where d.OrderHeaderId = OrderHeader.OrderHeaderId)
         ,0) as qty
  from OrderHeader
 where Criteria='X'
于 2012-12-30T20:04:13.640 に答える
1

答えは「はい」です。左結合テーブルの非キー条件をON句に移動すると、すべての結合後にwhere句を残してフィルタリングするのではなく、行が結果からできるだけ早く削除されるため、パフォーマンスが向上します。特に他のテーブルにさらに結合が行われる場合に行われます。

于 2012-12-30T20:07:42.390 に答える
1

データベースは、正しい結果を返す限り、自由にクエリを実行できます。そのため、SQL は宣言型言語と呼ばれます。必要な方法ではなく、必要なものを指定します。

ただし、この場合、 に移動すると、クエリの意味が変わりCriteria = 'X'ますleft join。クエリには、OrderDetails を含まない OrderHeaders が含まれます。したがって、データベースはあなたが提案するリファクタリングを自由に行うことができません。

于 2012-12-30T20:01:05.793 に答える