Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何向数据库表中的多行添加递增的数字_Sql_Database_Sql Update_Sybase - Fatal编程技术网

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查询,也用于对每个人的答案进行评估/给出很好的评论。这就是精神:)