SQL更新列以使用另一个表中的最大数字,但每个组增加1

问题描述 投票:0回答:3

假设我有一个表(VersionTEMP),其中包含以下3个条目:

--------------------------------
| VersionName    | VersionID   |
--------------------------------
| a-seattle      |             |
| e-everett      |             |
| k-kitsap       |             |
--------------------------------

我需要从另一个表(VersionHistory)中提取最大VersionID,然后将该数字+ 1分配给VersionTEMP中的每个唯一VersionName。因此,如果VersionHistory的最大VersionID是715,我的结果将是:

--------------------------------
| VersionName    | VersionID   |
--------------------------------
| a-seattle      |     716     |
| e-everett      |     717     |
| k-kitsap       |     718     |
--------------------------------

我怎么做到这一点?

sql sql-server
3个回答
0
投票

在SQL中,您可以使用可更新的CTE:

with toupdate as (
      select t.*, row_number() over (order by (select null)) as seqnum
      from t
     )
update toupdate
    set versionId = 714 + seqnum;

如果要动态提取数字:

with toupdate as (
      select t.*, row_number() over (order by (select null)) as seqnum
      from t
     )
update toupdate
    set versionId = ot.maxversionid + seqnum
    from toupdate cross join
         (select max(versionid) as maxversionid from othertable) ot;

0
投票

谢谢Gordon的快速回复。你的动态答案解决了我的问题。我确实更改了一些变量并在底部添加了where语句,所以它看起来像这样:

with [Update] as (
      select [VersionName], row_number() over (order by [VersionName]) as [SeqNum]
      from VersionTEMP Group By [VersionName]
     )
update [VersionTEMP]
    set [VersionID] = [MaxHistoryVersionID].[MaxVersionID] + [SeqNum]
    from [Update] cross join
         (select max(VersionID) as [MaxVersionID] from [OrderHistory]) as [MaxHistoryVersionID]
    where [VersionTemp].[VersionName] = [Update].[VersionName]

再次感谢!


0
投票

SQL Server,快速而又脏:

select appname, versionno + 1 from versionhistory where appname = 'Seattle'
UNION ALL
select appname, versionno + 1 from versionhistory where appname = 'Everett'
UNION ALL
select appname, versionno + 1 from versionhistory where appname = 'Kitsap'
GO

或者,获取所有应用程序

select appname, versionno + 1 from versionhistory order by whatever

可与CTE一起使用如下:

with CTE as (
    select appname as App, versionno + 1 as VersionNum from versionhistory where appname = 'Seattle'
    UNION ALL
    select appname as App, versionno + 1 as VersionNum from versionhistory where appname = 'Everett'
    UNION ALL
    select appname as App, versionno + 1 as VersionNum from versionhistory where appname = 'Kitsap'
    )
    insert into versionTEMP(appname, versionno) select App, VersionNum from CTE

要么

with CTE as (
select appname App, versionno + 1 VersionNum from versionhistory order by whatever
        )
        insert into versionTEMP(appname, versionno) select App, VersionNum from CTE

但CTE不是必需的:

insert into versionTemp (appname, versionid) select h.appname, h.versionid + 1 from versionhistory h

update versionTemp set appname = h.appname, versionid = h.versionid + 1 from versionhistory h
© www.soinside.com 2019 - 2024. All rights reserved.