1

SQL Server で次のエラーが発生します。

メッセージ 512、レベル 16、状態 1、行 18 サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、> >、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

私のコードは次のとおりです。

DECLARE
@personNumber varchar(20),
@itemNumber varchar(20)


SET @personNumber = 'null'
SET @itemNumber = 'null'

SELECT      
    OU.UserID
    ,OU.Name
    ,IGWQ.itemNumber
    ,IG.itemName
    ,IGWQ.QuantityOnHand
FROM dbo.Table1 IGWQ 
INNER JOIN Table2 OU        ON  IGWQ.UserId = OU.UserId
INNER JOIN Table3 IG        ON  IGWQ.itemNumber = IG.itemNumber
WHERE IGWQ.userid IN (CASE  WHEN @personNumber = 'null' 
                            THEN (  SELECT DISTINCT 
                                        UserID 
                                    FROM Table2 WITH(NOLOCK) 
                                    WHERE [Role] = '01')
                            ELSE @personNumber
                            END)
AND IGWQ.itemNumber IN (CASE    WHEN @itemNumber = 'null'
                                THEN (  SELECT DISTINCT 
                                            itemNumber 
                                        FROM dbo.Table1 WITH(NOLOCK))
                                ELSE @itemNumber
                                END)

誰でもこの問題の解決策を提案できますか? 「IN」を使用すると問題が解決すると思いました。

4

2 に答える 2

2

これを使用して残りを修正します。

WHERE ((@personNumber <> 'null' AND @personNumber = IGWQ.userid)
OR (@personNumber = 'null' AND IGWQ.userid IN (  SELECT  UserID 
                                    FROM Table2 WITH(NOLOCK) 
                                    WHERE [Role] = '01')
   ))

IN ステートメントは個別の値のみを処理するため、DISTINCT は必要ありません。

于 2012-12-05T23:09:18.150 に答える
0
WHERE (IGWQ.userid = @personNumber OR 
       @personNumber = 'NULL' and
       EXISTS (SELECT *
                 FROM Table2 t WITH (NOLOCK)
                WHERE t.[Role] = '01' AND t.UserID = IGWQ.userid)
  )
  AND (IGWQ.itemNumber = @itemNumber OR
       @itemNumber = 'NULL' and 
       EXISTS (SELECT *
                 FROM dbo.Table1 t WITH (NOLOCK)
                WHERE t.itemNumber = IGWQ.itemNumber)
  )

ノート:

  1. CASE はスカラーを返します。サブクエリ (つまり、セット) を返すことはできません。
  2. WITH (NOLOCK)廃止されました。代わりに、接続分離を READ UNCOMMITTED または SNAPSHOT に変更してください。
于 2012-12-05T23:08:04.353 に答える