2017-07-29 6 views
0

J'ai donc ce code dans le déclencheur d'insertion. Fondamentalement, quand j'essaie d'insérer à atbl_sales_orderlines, il vérifie s'il y a suffisamment de quantité dans atbl_sales_products pour insérer un nouvel ordre. Je me demandais si cela pourrait être fait d'une manière plus efficace (peut-être en utilisant moins SELECTS). Code ci-dessous:Simplifier la requête 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. Je sais qu'une telle chose devrait être faite avant le déclenchement. Je fais cela à des fins d'apprentissage. Le code fonctionne.

+0

Je pense que ce contrôle doit faire avant de l'insérer dans la table de déclenchement qui permettra d'éviter l'inutile IO –

+0

Je sais, mais im le faire à des fins d'apprentissage. Il doit être effectué dans le déclencheur. – Benua

+0

Beaucoup de SELECTS ne veut pas dire inefficace. – Mihai

Répondre

2

Il peut être simplifié pour enlever une table dérivée mais pas sûr de la différence de performance

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