2017-07-29 33 views
0

だから私は、挿入トリガーでこのコードを持っています。私はatbl_sales_orderlinesに挿入しようとすると、新たな秩序を挿入するatbl_sales_productsで十分な量がある場合は基本的に、それがチェックされます。私はこれがより効率的な方法で(おそらくより少ない選択肢を使用して)実行できるかどうか疑問に思っていました。以下のコード:簡素化T-SQL要求

BEGIN 
     IF (EXISTS (SELECT 1 FROM (
      SELECT x.ProductId, totalOrdersQty, ISNULL(asp.Quantity, 0) PossibleQty FROM (
       SELECT i.ProductId, sum(aso.Amount) totalOrdersQty 
       FROM (SELECT DISTINCT ProductId FROM inserted) i 
       JOIN atbl_Sales_OrdersLines aso ON aso.ProductId = i.ProductId 
       GROUP BY i.ProductId) x 
      LEFT JOIN atbl_Sales_ProductS asp ON asp.ProductId = x.ProductId 
      ) x 
      WHERE PossibleQty < totalOrdersQty)) 
     BEGIN 
      RAISERROR ('Quantity is not sufficient' ,18,1) 
      ROLLBACK TRANSACTION 
     END 
    END 

P.S.私はそのようなことが引き金の前に行われるべきであることを知っている。私は学習目的でこれをやっています。コードが動作します。

+0

わからない私は、このチェックは、私が知っている不要なIO –

+0

を避けることができますどのトリガテーブルに挿入する前に行う必要があると感じますが、イムかかわらず、1つの派生テーブルを削除するために単純化することができます学習の目的でこれを行う。トリガで実行する必要があります。 – Benua

+0

多くのSELECTSは効率的ではありません。 – Mihai

答えて

2

の性能差

BEGIN 
    IF EXISTS (SELECT 1 
       FROM atbl_sales_products asp 
       WHERE EXISTS (SELECT 1 
           FROM (select distinct productid from inserted) i 
            JOIN atbl_sales_orderslines aso 
             ON aso.productid = i.productid 
           WHERE asp.productid = x.productid 
           GROUP BY i.productid 
           HAVING Isnull(asp.quantity, 0) < Sum(aso.amount))) 
     BEGIN 
      RAISERROR ('Quantity is not sufficient',18,1) 

      ROLLBACK TRANSACTION 
     END 
END