2017-07-29 69 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

我知道以前做過,但即時通訊這樣做是爲了學習目的。它需要在觸發器中執行。 – Benua

+0

許多選擇並不意味着效率低下。 – 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