Sql server 如何在SQL中自动递增空值
下表中的Sql server 如何在SQL中自动递增空值,sql-server,sql-server-2016,Sql Server,Sql Server 2016,下表中的NULL值用于ID字段。我想创建一个查询,将所有NULL值替换为基于表中当前的maxID的自动递增数字 | ID | OBJECT | |------------ |-------- | | 5637144579 | Obj 1 | | NULL | Obj 2 | | 5637144584 | Obj 3 | | NULL | Obj 4 | 因此,最终结果应该是 | ID | OBJECT |
NULL
值用于ID字段。我想创建一个查询,将所有NULL
值替换为基于表中当前的maxID的自动递增数字
| ID | OBJECT |
|------------ |-------- |
| 5637144579 | Obj 1 |
| NULL | Obj 2 |
| 5637144584 | Obj 3 |
| NULL | Obj 4 |
因此,最终结果应该是
| ID | OBJECT |
|------------ |-------- |
| 5637144579 | Obj 1 |
| 5637144585 | Obj 2 |
| 5637144584 | Obj 3 |
| 5637144586 | Obj 4 |
请注意,NULL
s在每次更新后被替换为基于先前的maxID值的自动递增数字
现在,我有
SELECT
...
((select MAX(ID) from [dbo].MYTABLE) + 1 ) ID
...
但这会导致两个NULL
ID值的5637144585
。尝试以下答案:
DECLARE @MYTABLE TABLE(ID BIGINT, OBJECT VARCHAR(10))
INSERT INTO @MYTABLE VALUES (5637144579,'OBJ 1')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 2')
INSERT INTO @MYTABLE VALUES (5637144584,'OBJ 3')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 4')
UPDATE A SET A.ID=B.RN
FROM @MYTABLE A,(
SELECT *
,ROW_NUMBER() OVER(ORDER BY OBJECT)+(SELECT MAX(ID) FROM @MYTABLE)RN
FROM @MYTABLE
WHERE ID IS NULL)B
WHERE A.OBJECT=B.OBJECT
SELECT * FROM @MYTABLE
输出:
ID OBJECT
5637144579 OBJ 1
5637144585 OBJ 2
5637144584 OBJ 3
5637144586 OBJ 4
create table #sample
(
ID bigint
, [object] char(5)
)
insert into #sample
values (5637144579, 'Obj 1')
, (NULL, 'Obj 2')
, (5637144584, 'Obj 3')
, (NULL, 'Obj 4')
declare @max_id bigint = (select max(s.id) as id_bgn from #sample as s)
; with prelim as
(
select s.id
, s.[object]
, iif(s.id is null, 1, 0) as id_is_null
from #sample as s
)
select isnull(p.id, @max_id + sum(p.id_is_null) over (order by p.[object] asc)) as id
, p.[object]
from prelim as p
解决此问题的一种方法是使用
sum
over作为空ID
值的运行计数,并将其添加到先前的max(ID)
值中
样本数据:
ID OBJECT
5637144579 OBJ 1
5637144585 OBJ 2
5637144584 OBJ 3
5637144586 OBJ 4
create table #sample
(
ID bigint
, [object] char(5)
)
insert into #sample
values (5637144579, 'Obj 1')
, (NULL, 'Obj 2')
, (5637144584, 'Obj 3')
, (NULL, 'Obj 4')
declare @max_id bigint = (select max(s.id) as id_bgn from #sample as s)
; with prelim as
(
select s.id
, s.[object]
, iif(s.id is null, 1, 0) as id_is_null
from #sample as s
)
select isnull(p.id, @max_id + sum(p.id_is_null) over (order by p.[object] asc)) as id
, p.[object]
from prelim as p
回答:
ID OBJECT
5637144579 OBJ 1
5637144585 OBJ 2
5637144584 OBJ 3
5637144586 OBJ 4
create table #sample
(
ID bigint
, [object] char(5)
)
insert into #sample
values (5637144579, 'Obj 1')
, (NULL, 'Obj 2')
, (5637144584, 'Obj 3')
, (NULL, 'Obj 4')
declare @max_id bigint = (select max(s.id) as id_bgn from #sample as s)
; with prelim as
(
select s.id
, s.[object]
, iif(s.id is null, 1, 0) as id_is_null
from #sample as s
)
select isnull(p.id, @max_id + sum(p.id_is_null) over (order by p.[object] asc)) as id
, p.[object]
from prelim as p
我认为这是一个更简单的解决方案 生成表
DECLARE @MYTABLE TABLE(ID BIGINT, OBJECT VARCHAR(10))
INSERT INTO @MYTABLE VALUES (5637144579,'OBJ 1')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 2')
INSERT INTO @MYTABLE VALUES (5637144584,'OBJ 3')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 4')
回答
DECLARE @N BIGINT
SELECT @N = Max(ID) FROM @MYTABLE
UPDATE @MYTABLE
SET @N = @N+1,
ID = @N
WHERE ID IS NULL
SELECT * from @MYTABLE
如果只想选择,只需执行以下操作:
SELECT ID, Obj FROM test
WHERE ID IS NOT NULL
UNION
SELECT (SELECT Max(ID) FROM TEST) + ROW_NUMBER() OVER(ORDER BY OBJ) AS ID, OBJ
FROM TEST WHERE ID is NULL;
是MySQL还是SQL Server?答案不同。@BaconBits,使用
[dbo]
表明它是Microsoft SQL Server。这不是MySQL中标识符的合法语法。我会取下标签。Stack Overflow疯狂地试图为任何有关SQL语言的问题建议mysql标记。@BaconBits,很抱歉造成混淆。这是比尔建议的SQL Server。什么版本的SQL Server?2012/2014/etc.@tarheel SQL Server 2016(SP1-CU5)为什么不使用标准连接语法?