我正在研究一个数据库,我想要做的是创建一个带有ID(自动增量)的表和另一列:“数字”(我意识到这听起来没用,但请耐心等待我),我需要填充此“数字”列,其值为1到180,每次加1为前一个。
这样做的一种聪明的“自动”方法是什么?
答案 0 :(得分:3)
创建一个包含所需列的表(ID,数字)并将ID设置为自动递增。完成后,使用一段时间加载最多180个。
这是CREATE TABLE
CREATE TABLE [dbo].[<YOUR TABLE>](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Number] [int] NULL
) ON [PRIMARY]
这是INSERT
INSERT INTO <YOUR TABLE> (Number) VALUES (1);
WHILE SCOPE_IDENTITY() < 180
BEGIN
INSERT INTO <YOUR TABLE> (Number) VALUES (SCOPE_IDENTITY()+1);
END
答案 1 :(得分:3)
创建要更新的列0然后您可以简单地:
DECLARE @id INT = 0
UPDATE tbl
SET @id = id = (@id % 180 + 1)
只是为了增加删除% 180
。
答案 2 :(得分:2)
在transact SQL中,一个简单的更新应该让你想要
create table table_x ( A char(1), B int NULL )
declare @i int
select @i = 1
update table_x
set B=@i, @x=@i+1
from table_x
select * from table_x
答案 3 :(得分:1)
如果我理解正确,ROW_NUMBER()应该可以解决你的问题。
示例:
select ROW_NUMBER() OVER(ORDER BY ID) from sysobjects
如果你想要1到180,然后再想1到180:
select ((ROW_NUMBER() OVER(ORDER BY ID)) - 1) % 180 + 1 from sysobjects
更新
update tablename
set number =
(select number
from
(select
id,
((ROW_NUMBER() OVER(ORDER BY ID)) - 1) % 180 + 1 number
from tablename) u
where u.id = tablename.id)
答案 4 :(得分:0)
WITH n AS(SELECT 0 nUNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)
SELECT n1.n * 100 + n2.n * 10 + n3.n + 1
FROM n n1 CROSS JOIN n n2 CROSS JOIN n n3
WHERE n1.n * 100 + n2.n * 10 + n3.n + 1 <= 180
答案 5 :(得分:0)
Itzik Ben-Gan有一个很好的行号生成方法,它不使用表,只使用常量和交叉连接。在我眼里非常优雅。
来自http://www.projectdmx.com/tsql/tblnumbers.aspx#Recur
;WITH Nbrs_3( n ) AS ( SELECT 1 UNION SELECT 0 ),
Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),
Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),
Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),
Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )
SELECT n
FROM ( SELECT ROW_NUMBER() OVER (ORDER BY n)
FROM Nbrs ) D ( n )
WHERE n <= 180 ; -- or any number
您可以用任何数字替换180。您可以使用生成的插入序列代替选择。
答案 6 :(得分:0)
此查询将更新表中不需要%180的所有记录
update tableName
set columnName=
(select number
from
(select id, ((ROW_NUMBER() OVER(ORDER BY ID))) number
from TableName ) t
where t.id = tableName.id)
go
select * from tableName order by id
go