在Sql Server中始终返回指定数量的记录
我有一个查询,我总是想返回10条记录:在Sql Server中始终返回指定数量的记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个查询,我总是想返回10条记录: set rowcount 10 select row_number() over(order by count(*) desc) row_num ,hist_report_id ,max(rpt_report_name) report_name from utility.dbo.tbl_report_history join utility.dbo.tbl_report_definitions on hist_report_id =
set rowcount 10
select row_number() over(order by count(*) desc) row_num
,hist_report_id
,max(rpt_report_name) report_name
from utility.dbo.tbl_report_history
join utility.dbo.tbl_report_definitions
on hist_report_id = rpt_report_id
where hist_user_id = 1038
group by hist_report_id
如果我有10张或更多的记录,这就行了。问题是当记录少于10条时,我仍然需要在report_id和report_name字段中返回带有null的rownumber字段
如果仅返回7条记录,则结果应如下所示:
row_num report_id report_name
1 id1 name1
2 id2 name2
3 id3 name3
4 id4 name4
5 id5 name5
6 id6 name6
7 id7 name7
8 null null
9 null null
10 null null
有什么建议吗
我正在使用SQL Server 2008,这是我记忆中最简单的方法: 将select结果插入一个诱人的 当count*<10时,将行插入到
我记得最简单的方法是: 将select结果插入一个诱人的 当count*<10时,将行插入到 计数不能返回小于零的值。。。因此,只需通过union在count列中附加10个带-1的伪行 另外,不要使用SET ROWCOUNT,因为它会影响中间结果
SELECT TOP 10
row_number() over(order by TheCount desc) AS row_num,
hist_report_id,
report_name
FROM
(
select
,count(*) AS TheCount
,hist_report_id
,max(rpt_report_name) AS report_name
from
utility.dbo.tbl_report_history
join
utility.dbo.tbl_report_definitions on hist_report_id = rpt_report_id
where hist_user_id = 1038
group by hist_report_id
UNION ALL
SELECT TOP 10
-1, NULL, NULL
FROM sys.columns
) T
计数不能返回小于零的值。。。因此,只需通过union在count列中附加10个带-1的伪行
另外,不要使用SET ROWCOUNT,因为它会影响中间结果
SELECT TOP 10
row_number() over(order by TheCount desc) AS row_num,
hist_report_id,
report_name
FROM
(
select
,count(*) AS TheCount
,hist_report_id
,max(rpt_report_name) AS report_name
from
utility.dbo.tbl_report_history
join
utility.dbo.tbl_report_definitions on hist_report_id = rpt_report_id
where hist_user_id = 1038
group by hist_report_id
UNION ALL
SELECT TOP 10
-1, NULL, NULL
FROM sys.columns
) T
<>你可以考虑使用一个TVF来返回一组你可以与之连接的数字:
CREATE FUNCTION SetOfValues (@beginningAt int, @endingAt int, @step int = 1)
RETURNS
@result TABLE (value int )
AS BEGIN
declare @counter int set @counter = @beginningAt
while(@counter<=@endingAt)
begin
insert into @result values(@counter)
set @counter = @counter + @step
end
RETURN
END
GO
-- USAGE
with cte as (
select row_number() over (order by hist_report_Id) as row_num,
hist_report_Id, report_name
from tbl_report_history join tbl_report_definitions on hist_report_Id = rpt_reportId)
select value, hist_reportId, report_name
from dbo.SetOfValues(1,10,1) as t on t.value = cte.row_num
<>你可以考虑使用一个TVF来返回一组你可以与之连接的数字:
CREATE FUNCTION SetOfValues (@beginningAt int, @endingAt int, @step int = 1)
RETURNS
@result TABLE (value int )
AS BEGIN
declare @counter int set @counter = @beginningAt
while(@counter<=@endingAt)
begin
insert into @result values(@counter)
set @counter = @counter + @step
end
RETURN
END
GO
-- USAGE
with cte as (
select row_number() over (order by hist_report_Id) as row_num,
hist_report_Id, report_name
from tbl_report_history join tbl_report_definitions on hist_report_Id = rpt_reportId)
select value, hist_reportId, report_name
from dbo.SetOfValues(1,10,1) as t on t.value = cte.row_num
Sql server版本?我想您需要某种类型的带有临时表或表变量的联合。Sql server版本?我想你需要一个临时表或表变量的某种联合。太好了!我希望有一个单一的语句解决方案,这是完美的工作。太好了!我希望有一个单一的语句解决方案,这是完美的。