回到号码列表至设定值(Returning a list of numbers up to a set

2019-07-29 21:38发布

我已经看到了用于返回数字列表如下

SELECT TOP (SELECT MAX(Quantity) FROM @d) 
       rn = ROW_NUMBER() OVER (ORDER BY object_id)    
FROM   sys.all_columns 
ORDER BY object_id  

如果最大数量是5,然后我假定上述返回:

rn
1
2
3
4
5

有没有返回数字的此列表的更优雅的方式?

Answer 1:

你可以做:

SELECT        rn = 1 
  UNION ALL SELECT 2 
  UNION ALL SELECT 3 
  UNION ALL SELECT 4 
  UNION ALL SELECT 5;

这是可以容忍的,当数为5个,但不是50或5000当您需要更多,你可以做这样的事情用一个CTE来建立一组数字来那么CROSS JOIN爆炸设定的(你可以看到一对夫妇的例子这里,内插的1/2在线下 )。

或者,你可以建立数表,让我们说你可能需要5或者你可能需要一个亿:

SET NOCOUNT ON;

DECLARE @UpperLimit INT = 1000000;

WITH n AS
(
    SELECT
        x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
    FROM       sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
    CROSS JOIN sys.all_objects AS s3
)
SELECT Number = x
  INTO dbo.Numbers
  FROM n
  WHERE x BETWEEN 1 AND @UpperLimit;

GO
CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(Number);
GO

然后,当你想要一些数字你刚才说的:

SELECT TOP (5) rn = Number 
  FROM dbo.Numbers 
  ORDER BY Number;

显然,使用sys.all_columns或具有足够的行任何内置对象以避免创建Numbers表格中的前期步骤(其中许多人反对,出于某种原因,反正)。

现在,这将是如果一个更优雅的方式来做到这一点真的很好,不是吗? 你不会看到它在任何当前的版本,但有一个机会,我们会看到它在未来的版本。 请去投票(更重要的是,你的使用情况发表评论)在这里:

http://connect.microsoft.com/SQLServer/feedback/details/258733/add-a-built-in-table-of-numbers



Answer 2:

我用这样的事情在过去 - 尽管它只能达到100左右:

WITH Numbers(number) AS (
SELECT 1 number
UNION ALL
SELECT number+1 FROM Numbers WHERE number < 10)
SELECT * FROM Numbers


Answer 3:

首先,创建数表0 - 9

create table dbo.Digits (digit tinyint not null Primary Key) 
insert into dbo.Digits values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)

然后你就可以产生以下CROSS JOIN从1到100来算:

select
D2.digit * 10 + 
D1.digit + 1 as n
from dbo.Digits D1,
dbo.Digits D2
order by n

从1数到1000,你只需要增加一个额外的交叉连接:

select
D3.digit * 100 +
D2.digit * 10 + 
D1.digit + 1 as n
from dbo.Digits D1,
dbo.Digits D2,
dbo.Digits D3
order by n

从1计数至x(其中,x <= 1000)::

select top x
D3.digit * 100 +
D2.digit * 10 + 
D1.digit + 1 as n
from dbo.Digits D1,
dbo.Digits D2,
dbo.Digits D3
order by n


Answer 4:

绝对不是最优雅的,但可能是更大序列的最快方法:

WITH
 E1(N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
           SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
           SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
           SELECT 1),                 --10E1  or 10 rows
 E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E2  or 100 rows
 E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E3  or 10000 rows
 E8(N) AS (SELECT 1 FROM E4 a, E4 b)  --10E4  or 100000000 rows
SELECT TOP (@DesiredRowCount) N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E8
;

没有临时表,无表中读取,你可以自己定义你的最大值。

从您可以复制,粘贴准备使用的功能在这里



Answer 5:

修改前值要求:

SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY [object_id]) 
FROM sys.all_objects

例如,呈现出范围为NULL,1一个下拉列表 - 为受教育年限的名单30。

<tr>
<td>Education</td>
<td>
<asp:DropDownList ID="EducationDropDownList" runat="server" DataSourceID="sd6"
 DataValueField="Education" DataTextField="Education" 
 SelectedValue='<%# Bind("Education") %>' CssClass="metro" />
<asp:SqlDataSource ID="sd6" runat="server" 
 ConnectionString="<%$ ConnectionStrings:cnYours %>" 
 SelectCommand="SELECT NULL AS Education UNION ALL SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects" 
 SelectCommandType="Text" />
</td>
</tr>


Answer 6:

如果你只是想你的输出包含一个流水号作为一个附加列,下面将工作以及:

select row_number() over (order by (Select 1)) AS RowNum, * from Table_1 where Column_3 = 372 and Column_6 = 2017;


文章来源: Returning a list of numbers up to a set value