2015-02-23 52 views
0

我有一个存储过程,根据特定的条件返回一个整数1或0。它目前使用三个选择语句,并将在多个位置被多个用户大量使用。必须有一个更有效的方式来做到这一点。较便宜的查询?

简而言之,查询首先检查订单上的所有清单项是否已完成(单独的表),然后检查名为BreakOutGuest的字段(位字段)是否为1或0.根据结果它会检查总客人数是否大于0且订单总数为零。它在所有这些标准上返回一个或零。有没有更有效的方法来做到这一点?临时表,所以我只需要打一次实际的表?以下是代码。

@ORDERID INT 

AS 
BEGIN 

DECLARE @AUTO_CLOSE INT 



    SET NOCOUNT ON; 

--If all checklist items are marked complete move on, if not set @AUTO_CLOSE=0 
IF NOT EXISTS(SELECT ORDERID FROM dbo.orderchecklistitems WHERE [email protected] AND CompletedON IS NULL) 
BEGIN 

--if BreakOutGuestFees is 1 only sum Guest_Count_1 + Guest_Count_2 
IF EXISTS(SELECT * FROM dbo.Orders WHERE (GuestCount_1 + GuestCount_2)>1 AND OrderTotal=0 AND BreakoutGuestFees=1) 

BEGIN 
SET @AUTO_CLOSE=1 
END 
ELSE 
SET @AUTO_CLOSE=0 
--if BreakOutGuestFees is 0 only consider Guest_Count_1 
IF EXISTS(SELECT * FROM dbo.Orders WHERE (GuestCount_1)>1 AND OrderTotal=0 AND BreakoutGuestFees=0) 
BEGIN 
SET @AUTO_CLOSE=1 
END 
ELSE 
SET @AUTO_CLOSE=0 

END 
ELSE 
SET @AUTO_CLOSE=0 

END 
+2

你是不是遗漏了'OrderID'搜索在其他两个访问'订单'表?为什么这不只是一个返回'1'或'0'的'select'? – Luaan 2015-02-23 17:44:19

+0

是的,我是。我在公开论坛上发布了实际存储过程以删除敏感信息,并且意外地删除了第二个选择语句中的“和[email protected]”子句,但它在那里。 – Michael 2015-02-23 17:53:23

回答

2

如果我没看错,你可以通过使用ANDOR逻辑将两个if条款分为单if条款。尝试这个。

IF NOT EXISTS(SELECT ORDERID 
       FROM dbo.orderchecklistitems 
       WHERE OrderID = @ORDERID 
        AND CompletedON IS NULL) 
    BEGIN 
     IF EXISTS(SELECT * 
       FROM dbo.Orders 
       WHERE ((GuestCount_1 + GuestCount_2 > 1 
          AND BreakoutGuestFees = 1) 
          OR (BreakoutGuestFees = 0 
           AND GuestCount_1 > 1)) 
         AND OrderTotal = 0 
         AND OrderID = @ORDERID) 
     SET @AUTO_CLOSE=1 
     ELSE 
     SET @AUTO_CLOSE=0 
    END 
ELSE 
    SET @AUTO_CLOSE=0 
+0

谢谢大家。所有解决方案建议工作,我结束了使用NoDisplayName的解决方案,并做了一些适合我们特定编码协议的小改动。 – Michael 2015-02-23 18:17:28

1

你可以只用一个查询执行您选择支票

SELECT 
    (SELECT sum(1) FROM dual WHERE EXISTS (SELECT ORDERID FROM dbo.orderchecklistitems WHERE [email protected] AND CompletedON IS NULL)), 
    (SELECT sum(1) FROM dual WHERE EXISTS (SELECT 1 FROM dbo.Orders WHERE (GuestCount_1 + GuestCount_2)>1 AND OrderTotal=0 AND BreakoutGuestFees=1)), 
    (SELECT sum(1) FROM dual WHERE EXISTS (SELECT 1 FROM dbo.Orders WHERE (GuestCount_1)>1 AND OrderTotal=0 AND BreakoutGuestFees=0)) 
    INTO 
    result1, result2, result3 
    from dual 

然后检查结果

+2

1查询你说....? – Chains 2015-02-23 18:01:56

+0

另外,OP的代码看起来像T-SQL。你不需要(或有)在MS SQL上的“双重”。 – Luaan 2015-02-24 08:31:34

1
DELCARE @AUTO_CLOSE INT = 0 

IF NOT EXISTS(SELECT ORDERID 
       FROM dbo.orderchecklistitems 
       WHERE OrderID = @ORDERID 
        AND CompletedON IS NULL) 
    BEGIN 
     SET @AUTO_CLOSE = 
     (
      SELECT 
       CASE 
        WHEN (GuestCount_1 + GuestCount_2 > 1) AND BreakoutGuestFees = 0 THEN 1 
        WHEN (GuestCount_1 > 1) AND BreakoutGuestFees = 1 THEN 1 
        ELSE 0 END 
      FROM dbo.orders 
      WHERE OrderTotal = 0 AND OrderID = @orderID 
     ) 
    END