Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SQL子查询返回的值超过1_.net_Sql_Sql Server_Subquery_Row Number - Fatal编程技术网

.net SQL子查询返回的值超过1

.net SQL子查询返回的值超过1,.net,sql,sql-server,subquery,row-number,.net,Sql,Sql Server,Subquery,Row Number,嗨,我正在尝试执行一个查询,以获取某个数字之间的行,就像我试图获取10-20之间的行一样。所以我使用子查询,这样我就可以使用行数函数 查询失败,错误为: SQL子查询返回的值超过1 所以我需要找到一条出路,因为我需要从查询中获得更多的结果集 PROCEDURE dbo.Search ( @search_text varchar(max), @search_category varchar(max), @page int, @COUNT INT OUTP

嗨,我正在尝试执行一个查询,以获取某个数字之间的行,就像我试图获取10-20之间的行一样。所以我使用子查询,这样我就可以使用行数函数

查询失败,错误为:

SQL子查询返回的值超过1

所以我需要找到一条出路,因为我需要从查询中获得更多的结果集

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

问题在于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)

具体来说,该组由dealId部分组成。如果该表上有多个dealId,那么将得到多行。显然,你不能在标量变量上赋值。要么@Count需要声明为一个表变量,该变量将更改sp其余部分的逻辑,要么您通过dealId摆脱该组,并验证它是否提供了所需的结果。

我必须同意@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!
;

除了其他人所说的填充返回多行的变量的子查询之外,可能还有一种更有效的方法来获取您所寻找的内容,我假设这就是分页。这假设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

您确定这都是您的sql,并且上面的sql由于您所说的错误而失败吗?如果没有,请发布返回错误消息的实际SQL。问题是什么?你得到了什么,你想得到什么?到目前为止,这一切看起来都是正确的。当我尝试运行此过程时,我得到此异常子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。但是,当我使用sql management studio中相同的参数执行该过程时,我得到了预期的结果。您显示的sql无法生成该错误。你是在StoredProc中调用它吗?它是函数的一部分吗?dealData是视图吗?它是否嵌入到更大的查询中?请包括从原始SQL调用到所有视图、存储过程和函数定义的所有内容。@Amrit-请包括从原始SQL调用到所有视图、存储过程和函数定义的所有内容。。。不幸的是,是的还不够。我们需要整个存储过程的代码,它调用的所有视图和函数等等。很明显,您认为您已经将问题缩小到了一个查询,不幸的是,该错误不直接出现在该查询中。组id是主键,所以它不应该是唯一的吗result@Amrit-你似乎不明白这个问题。如果dealId是主键,那么解释起来就容易多了。如果放置在WHERE上的条件返回多行,那么假设它返回3行,因为您是按主键分组的,所以将有3行计数值为1,而不是1行计数值为3。当然,您得到的结果不能分配给标量变量。GROUPBY将返回。。。DealID=1,Count=3 | DealID=2,Count=2 | DealID=3,Count=5。。。etc@Charleh-不是真的,它应该是:DealID=1,Count=1 | DealID=2,Count=1 | DealID=3,Count=1@Amrit它与GroupID是主键这一事实几乎没有关系。用彩色铅笔来思考。您的存储过程预计总共有一个铅笔计数。正如拉马克的评论所表明的那样,你给它一个蓝、黄、绿、红等颜色的铅笔的计数,在任何一个给定的框中,每个铅笔都是1支。
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