1

私は数字のリストを返すために使用される以下を見てきました

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

この数値のリストを返すための、T-SQL内のより洗練された、または標準的なアプローチはありますか?

4

6 に答える 6

7

できるよ:

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

これは、数値が5の場合は許容できますが、50や5000は許容できません。さらに必要な場合は、CTEを使用して数値のセットを作成し、クロス結合してセットを分解するなどの方法を実行できます(いくつかの例を見ることができます)。ここでは、インライン1 /インライン2の下にあります)。

または、数値のテーブルを作成することもできます。たとえば、5が必要な場合や、100万が必要な場合があります。

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

于 2012-06-13T17:42:32.190 に答える
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
;

一時テーブルもテーブル読み取りもありません。最大値は自分で定義できます。

ここからすぐに使える機能をコピー&ペーストできます

于 2014-05-26T21:56:19.523 に答える
3

私は過去にこのようなものを使用しました-それは100かそこらまでしか機能しませんが:

WITH Numbers(number) AS (
SELECT 1 number
UNION ALL
SELECT number+1 FROM Numbers WHERE number < 10)
SELECT * FROM Numbers
于 2012-06-13T18:01:29.333 に答える
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)

次に、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
于 2013-06-14T19:38:39.917 に答える
1

必要に応じてTop値を変更します。

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>
于 2017-01-28T07:40:10.747 に答える
1

出力に追加の列として実行番号のみを含める場合は、次のように機能します。

select row_number() over (order by (Select 1)) AS RowNum, * from Table_1 where Column_3 = 372 and Column_6 = 2017;
于 2017-05-23T09:00:10.753 に答える