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 )

3 つのレコードが返されます (順不同):

1
2
10

また

1
10
2

基本的に、受信 sproc 変数 @Dish_1、@Dish_2、@Dish_3 に正確に 1、2、および 10 が含まれている場合、1 (True) を返します。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)
4

2 に答える 2

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;

3 つのレコードすべてが一致する場合、クエリは 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
                                  ))
于 2013-07-23T02:47:53.690 に答える
0

あなたの質問を正しく理解できれば、クエリの結果を 3 つの変数の値のセットと比較したいと思うでしょう。exceptandステートメントを使用してunion、対称差を実装できます。

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;
于 2013-07-23T03:14:59.967 に答える