Sql 如何向数据库表中的多行添加递增的数字
我需要将行项目添加到表中。以下是我拥有的一个例子(规模小得多): 这就是我需要的Sql 如何向数据库表中的多行添加递增的数字,sql,database,sql-update,sybase,Sql,Database,Sql Update,Sybase,我需要将行项目添加到表中。以下是我拥有的一个例子(规模小得多): 这就是我需要的 shiptoid,lineitem 642218,1 642218,2 642218,3 3041340,1 3041077,1 3041077,2 对于每个唯一的shiptoid,我需要一个从1开始递增的行项目编号。我在过去也做过类似的事情,但我一辈子都想不出来。如果您使用的是SQL Server,这将起作用: declare @tbl table (shiptoid int) insert into @tb
shiptoid,lineitem
642218,1
642218,2
642218,3
3041340,1
3041077,1
3041077,2
对于每个唯一的shiptoid,我需要一个从1开始递增的行项目编号。我在过去也做过类似的事情,但我一辈子都想不出来。如果您使用的是SQL Server,这将起作用:
declare @tbl table (shiptoid int)
insert into @tbl values (642218), (642218), (642218), (3041340), (3041077), (3041077)
select shiptoid, row_number() over (partition by shiptoid order by shiptoid) as lineitem from @tbl
以下是它的回报:
shiptoid lineitem
----------- --------------------
642218 1
642218 2
642218 3
3041077 1
3041077 2
3041340 1
旧查询 对于SQL Server:
SELECT ROW_NUMBER()
OVER (ORDER BY ShiptoID) AS Row,
ShiptoID
FROM YourShip
对于MYSQL:
SELECT s.shiptoid,
@rownum := @rownum + 1 AS Row
FROM yourship s,
(SELECT @rownum := 0) r
对于Oracle:
SELECT ShiptoID, ROWNUM AS Row,
ShiptoID
FROM YourShip
更新的查询 对于MySQL:*:忽略同一页面中的其他表 查询:
select y.shiptoID, y.row
from (select shiptoID,
@row:=if(@x=shiptoID,@row,0) + 1 as row,
@x:=shiptoID
from yourship
order by shiptoID, row asc
)as y
SELECT shiptoID,
DENSE_RANK() OVER
(PARTITION BY shiptoID ORDER BY rownum) AS row
FROM yourShip
;
结果:
SHIPTOID ROW
642218 1
642218 2
642218 3
3041077 1
3041077 2
3041340 1
SHIPTOID ROW
642218 1
642218 2
642218 3
3041077 1
3041077 2
3041340 1
对于Oracle:Oracle在分区上具有类似于MYSQL的RANK()
,densite\u RANK()
因此,我们可以使用类似于ORACLE中MYSQL的查询。但最好的部分是,我在orderby
子句中使用了ROWNUM
)可以说这三种语言中最简单的逻辑/语法
参考资料:*
查询:
select y.shiptoID, y.row
from (select shiptoID,
@row:=if(@x=shiptoID,@row,0) + 1 as row,
@x:=shiptoID
from yourship
order by shiptoID, row asc
)as y
SELECT shiptoID,
DENSE_RANK() OVER
(PARTITION BY shiptoID ORDER BY rownum) AS row
FROM yourShip
;
结果:
SHIPTOID ROW
642218 1
642218 2
642218 3
3041077 1
3041077 2
3041340 1
SHIPTOID ROW
642218 1
642218 2
642218 3
3041077 1
3041077 2
3041340 1
您没有提到您的DBMS,因此这是ANSI SQL(适用于大多数现代DBMS):
您正在使用哪种RDBMS?这是SQL Server吗?如果是这样的话,您是否查看了(按…顺序…分区)上的行编号()
?我无法对MySQL或Oracle发表评论,但SQL Server代码不会像请求的OP那样重新启动每个新ShiptoID的计数。您必须使用partitionby
来实现这一点。如果MySQL和Oracle也能做到这一点,我很想看到您更新您的答案+1如果你这样做了@詹姆斯勒。我想虽然我还没有更新答案,但我在这里被否决了:(应该指望你的+1:)我真的错过了行号,我的坏消息只是看到了递增…Oracle查询也不会做预期的事情(而且Oracle也支持标准窗口功能)@一匹没有名字的马:刚刚用Oracle的另一种方式更新。:)除此之外,如果是MSSQLServer,则必须将order by
与分区by
包含在一起,否则会出现语法错误。@JamesL.:啊!微软对ANSI标准的无知再次出现;)感谢您指出这一点。+1用于您的SQLServer查询,也用于对每个人的答案进行评估/给出很好的评论。这就是精神:)