.net SQL子查询返回的值超过1
嗨,我正在尝试执行一个查询,以获取某个数字之间的行,就像我试图获取10-20之间的行一样。所以我使用子查询,这样我就可以使用行数函数 查询失败,错误为: 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
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