0

次のSELECTステートメントがあります

SELECT
       UserID
      ,UserName
      ,TradingParty
      ,Email
      ,[PrivDesc]
      ,LastLogin
      ,IsApproved

FROM
    cte_getAll allUsers
 WHERE
      allUsers.TradingParty                                            = COALESCE(@TradingParty, allUsers.TradingParty)
    AND allUsers.Username                                      = COALESCE(@Username, allUsers.Username) 
    AND allUsers.Email                                       = COALESCE(@EmailAddress, allUsers.Email)
    AND DATEADD(dd, DATEDIFF(dd, 0, allUsers.[LastLogin]), 0)   >= COALESCE(@FromDate, DATEADD(dd, DATEDIFF(dd, 0, allUsers.[LastLogin]), 0)) 
    AND DATEADD(dd, DATEDIFF(dd, 0, allUsers.[LastLogin]), 0)   <= COALESCE(  @ToDate, DATEADD(dd, DATEDIFF(dd, 0, allUsers.[LastLogin]), 0))
    AND allUsers.IsApproved                                   = COALESCE(@AccountActive, allUsers.IsApproved)
      AND allUsers.[PrivId]                                        -- IN (SELECT privId from @selectedPriv)
                                                                      IN (COALESCE((SELECT PrivID FROM @selectedPriv), allUsers.[PrivId]))

編集 このステートメントの前に、ユーザーの入力に従って@selectedPriv一時テーブルにデータを入力しています。ユーザー入力がない場合、テーブルには何も含まれません

最後の AND ステートメントで、privId がユーザーが入力した特権のリストと等しいすべてのデータを検索しようとしています。したがって、たとえば、ユーザーは一時テーブルに格納されている 1,2,3,4,5,6 を入力します。これから、これらの特権に関連付けられている元のテーブルからすべての行を見つける必要があります。コメント付きのINステートメントを使用すると問題が発生しますが、ユーザーはNULLを渡すことが許可されているため、COALESCE内で必要ですが、これを行うとメッセージが表示されます

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

これがなぜなのか、私には手がかりがありません。この問題を解決するのに役立つアイデアはありますか?

4

4 に答える 4