-1

こんにちは、クエリを実行して特定の数の間の行を取得しようとしています。10 ~ 20 の間の行を取得しようとしているようです。だから私はrow_number()関数を使用できるようにサブクエリを使用しています

クエリは次のエラーで失敗します。

SQL サブクエリが複数の値を返す

クエリから1つ以上のresulsetを取得する必要があるため、方法を見つける必要があります

PROCEDURE dbo.Search

    (
    @search_text varchar(max), 
    @search_category varchar(max),
    @page int,
    @COUNT INT OUTPUT
    )

AS

     SET NOCOUNT ON
     DECLARE @Lower_limit int = (@page-1)*10;
     DECLARE @Upper_limit int = (@page * 10) + 1;
    -- SET @COUNT =0
     IF @search_category='deal'
     BEGIN
        SET @COUNT = (SELECT COUNT(*) FROM dealData WHERE dealInfo LIKE  '%' + @search_text + '%' OR dealName LIKE '%' + @search_text + '%' OR dealDescription LIKE  '%' + @search_text + '%' GROUP BY dealId);
        SELECT x.dealId , x.ROW 
        FROM
        ( SELECT dealId,ROW_NUMBER() OVER(ORDER BY dealId) as ROW from dealData WHERE dealInfo LIKE  '%' + @search_text + '%' OR dealName LIKE '%' + @search_text + '%' OR dealDescription LIKE  '%' + @search_text + '%'  GROUP BY dealId)x   
        WHERE x.ROW < @Upper_limit AND x.ROW > @Lower_limit
     END

これは完全な手順であり、次のコードから呼び出そうとすると、_command.ExecuteReader(); で例外が発生します。Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

 _query = "Search";
                _command = new SqlCommand(_query, _connection);
                _command.CommandType = CommandType.StoredProcedure;
                _command.Parameters.AddWithValue("@search_text", search_text);
                _command.Parameters.AddWithValue("@search_category", search_category);
                _command.Parameters.AddWithValue("@page", page);
                var returnParameter = _command.Parameters.Add("@COUNT", SqlDbType.Int);
                returnParameter.Direction = ParameterDirection.Output;
                _reader = _command.ExecuteReader();
                while (_reader.Read())
                {
                    search_result index = new search_result();
                    index.category_id = this._categoryIdFromName(search_category);
                    index.post_id = _reader.GetValue(0).ToString();
                    _searchList.Add(index);
                }
4

3 に答える 3

4

問題はあなたのspのこの部分です:

SET @COUNT = (  SELECT COUNT(*) FROM dealData 
                WHERE dealInfo LIKE  '%' + @search_text + '%' 
                OR dealName LIKE '%' + @search_text + '%' 
                OR dealDescription LIKE  '%' + @search_text + '%' 
                GROUP BY dealId)

具体的には、そのGROUP BY dealId部分です。dealIdそのテーブルに複数ある場合、結果として複数の行が取得されます。明らかに、それをスカラー変数に割り当てることはできません。テーブル@Count変数として宣言する必要があります (これにより、sp の残りのロジックが変更されます)、または を取り除き、GROUP BY dealId目的の結果が得られることを確認します。

于 2012-06-29T19:38:59.377 に答える
2

私は@Lamakに同意する必要があり、繰り返しが知識を与えることができるように回答を投稿するだけです。次のように課題を書き直すと、問題は解決します。

SELECT @COUNT = COUNT(*) 
  FROM dbo.dealData 
  WHERE dealInfo        LIKE '%' + @search_text + '%' 
     OR dealName        LIKE '%' + @search_text + '%' 
     OR dealDescription LIKE '%' + @search_text + '%' 
  /* GROUP BY dealId */ -- there is NO REASON for this grouping if you want total count!
;
于 2012-06-29T20:41:04.410 に答える
0

複数の行を返す変数を設定するサブクエリについて他の誰もが述べたことは別として、あなたが求めているものを取得するためのより効率的な手段があるかもしれません(私はページングであると仮定しています)。これは、コメントに記載されているように、それがテーブルGroupIdの主キーであると想定しています。DealData

Declare @Results Table
    (
    DealId ... not null Primary Key
    , RowNumAsc int not null
    , TotalCount int not null
    );

With NumberedData As
        (
        Select DealId
            , Row_Number() Over ( Order By GroupId ) As RowNumAsc
            , Row_Number() Over ( Order By GroupId Desc ) As RowNumDesc
        From DealData
        Where dealInfo LIKE  '%' + @search_text + '%' 
            Or dealName LIKE '%' + @search_text + '%' 
            Or dealDescription LIKE  '%' + @search_text + '%'  
        )
Insert @Results( DealId, RowNumAsc, TotalCount )
Select DealId, RowNumAsc
    , Min( RowNumAsc + RowNumDesc - 1 ) As Count
From NumberedData
Where RowNumAsc < @UpperLimit
    And RowNumAsc >= @LowerLimit
Group By DealId 

Set @Count = ( Select TOP 1 TotalCount From @Results );
Select DealId, RowNumAsc
From @Results
于 2012-06-29T21:06:05.037 に答える