2013-07-23 25 views
0

我有一定的困难,在尝试比较了一定的成效,基本的SQL Server +对输出进行比较的结果

(选择[DishId] FROM [Package_Set_Dish],其中[Package_Set_Id] = COALESCE((SELECT [SETID ] FROM [Package_Schedule_Set_Daily] WHERE [自动识别] = @PkSchSetId),(SELECT [SETID] FROM [Package_Schedule_Set_Weekly] WHERE [自动识别] = @PkSchSetId)

将返回3条记录(不按顺序):

1 
2 
10 

1 
10 
2 

基本上,如果传入SPROC变量@ Dish_1,@ Dish_2,@ Dish_3正好包含1,2和10中,我将返回1(真)。如果它包含1,2,2或1,10,10,它应该返回0.

显然,下面的查询不会返回所需的结果。谁能建议。谢谢。

SET @TempBit = (SELECT CASE WHEN 
      (@Dish_1 IN (SELECT [DishId] FROM [Package_Set_Dish] WHERE [Package_Set_Id] 
    = COALESCE((SELECT [SetId] FROM [Package_Schedule_Set_Daily] 
     WHERE [AutoId] = @PkSchSetId), 
     (SELECT [SetId] FROM [Package_Schedule_Set_Weekly] WHERE [AutoId] = @PkSchSetId))) 
     AND @Dish_2 IN (SELECT [DishId] FROM [Package_Set_Dish] WHERE [Package_Set_Id] 
    = COALESCE((SELECT [SetId] FROM [Package_Schedule_Set_Daily] 
     WHERE [AutoId] = @PkSchSetId) 
    , (SELECT [SetId] FROM [Package_Schedule_Set_Weekly] WHERE [AutoId] = @PkSchSetId))) 
     AND @Dish_3 IN (SELECT [DishId] FROM [Package_Set_Dish] WHERE [Package_Set_Id] 
      = COALESCE((SELECT [SetId] FROM [Package_Schedule_Set_Daily] 
     WHERE [AutoId] = @PkSchSetId) 
    , (SELECT [SetId] FROM [Package_Schedule_Set_Weekly] WHERE [AutoId] = @PkSchSetId)))          
AND (SELECT [Date] FROM [Customer_Order_SwapSetDish] 
     WHERE [CustOrderId] = @CustOrderId) = @Date) THEN 1 ELSE 0 END AS BIT) 

回答

0

这是您的查询:

SELECT [DishId] 
FROM [Package_Set_Dish] 
WHERE [Package_Set_Id] = COALESCE((SELECT [SetId] 
            FROM [Package_Schedule_Set_Daily] 
            WHERE [AutoId] = @PkSchSetId 
           ), 
            (SELECT [SetId] 
            FROM [Package_Schedule_Set_Weekly] 
            WHERE [AutoId] = @PkSchSetId 
           )) 

您可以用having条款做测试

SELECT count(*) 
FROM [Package_Set_Dish] 
WHERE [Package_Set_Id] = COALESCE((SELECT [SetId] 
            FROM [Package_Schedule_Set_Daily] 
            WHERE [AutoId] = @PkSchSetId 
           ), 
            (SELECT [SetId] 
            FROM [Package_Schedule_Set_Weekly] 
            WHERE [AutoId] = @PkSchSetId 
           )) 
having sum(case when DishId = @DishId1 then 1 else 0 end) > 0 and 
     sum(case when DishId = @DishId2 then 1 else 0 end) > 0 and 
     sum(case when DishId = @DishId3 then 1 else 0 end) > 0; 

如果所有三个记录匹配,那么该查询将返回1,如果有是不匹配的,那么它将返回NULL

或者,你可以做到这一点在select

SELECT (case when sum(case when DishId = @DishId1 then 1 else 0 end) > 0 and 
        sum(case when DishId = @DishId2 then 1 else 0 end) > 0 and 
        sum(case when DishId = @DishId3 then 1 else 0 end) > 0 
      then 1 else 0 
     end) as AreAllThere 
FROM [Package_Set_Dish] 
WHERE [Package_Set_Id] = COALESCE((SELECT [SetId] 
            FROM [Package_Schedule_Set_Daily] 
            WHERE [AutoId] = @PkSchSetId 
           ), 
            (SELECT [SetId] 
            FROM [Package_Schedule_Set_Weekly] 
            WHERE [AutoId] = @PkSchSetId 
           )) 
0

如果我理解你的问题正确,你想查询的结果与一组三个变量的值进行比较。您可以使用exceptunion语句来实现对称差异:

select case when count(*)=0 then 1 else 0 end 
from 
(
    (
    (SELECT [DishId] as col FROM [Package_Set_Dish] WHERE [Package_Set_Id] = COALESCE((SELECT [SetId] FROM [Package_Schedule_Set_Daily] WHERE [AutoId] = @PkSchSetId), (SELECT [SetId] FROM [Package_Schedule_Set_Weekly] WHERE [AutoId] = @PkSchSetId))) 
    except 
    (select @Dish_1 as col union @Dish_2 as col union @Dish_3 as col) 
) 
    union 
    (
    (select @Dish_1 as col union @Dish_2 as col union @Dish_3 as col) 
    except 
    (SELECT [DishId] as col FROM [Package_Set_Dish] WHERE [Package_Set_Id] = COALESCE((SELECT [SetId] FROM [Package_Schedule_Set_Daily] WHERE [AutoId] = @PkSchSetId), (SELECT [SetId] FROM [Package_Schedule_Set_Weekly] WHERE [AutoId] = @PkSchSetId))) 
) 
) t;