【问题标题】:TSQL - Updating column based on bit columnTSQL - 基于位列更新列
【发布时间】:2018-11-02 13:05:12
【问题描述】:

我的表 [ID] 中有一个标识列。我还有一个基于标识列的计算列,如下所示;

create table [dbo].[tblMaster] (
ID bigint identity(1,1),
GlobalFamilyUniqueID int,
DupeIdentifier as cast('EDME' + RIGHT('00000000'+ISNULL(cast([ID] as nvarchar(max)),''),8) as nvarchar(30)),
ControlNumber nvarchar(30),
NuixGuid nvarchar(50),
TopLvlGuid nvarchar(50),
ParentGuid nvarchar(50),
CustodianArtifactID int,
IsGlobalFamilyUnique int,
IsCustodianFamilyUnique int,
IsItemUnique int,
ItemUniqueDupID nvarchar(100),
IsChild int,
GroupIdentifier nvarchar(100),
DatasourceID int,
MD5Hash nvarchar(32),
GlobalFamilyDupID nvarchar(100),
CustodianFamilyDupId nvarchar(100),
ExportSessionID nvarchar(100)

)

我想根据IsGlobalFamilyUnique 列更新ControlNumber 列。此时,无论IsGlobalFamilUnique1 还是0DupeIdentifier 都会有一个值。我需要ControlNumber 具有基于ControlNumber 字段中最后一个值的增量值(我创建了另一个名为GlobalFamilyUnqiueID 的列作为“计数器”列),但仅当IsGlobalFamilUnique1

这是我目前所处的位置;

update x
    set 
    GlobalFamilyUniqueID = [ProposedGlobalFamilyUniqueID],
    ControlNumber = [ProposedControlNumber]
from(
    Select top 10 [id],
        DupeIdentifier,
    --  ControlNumber,
        isglobalfamilyunique,
        --GlobalFamilyUniqueID,
        GlobalFamilyUniqueID,
        Row_Number() Over(Order By [id]) [ProposedGlobalFamilyUniqueID],
        ControlNumber,
        'TEST' + RIGHT('00000000'+ISNULL(cast(Row_Number() Over(Order By [id]) as nvarchar(30)),''),8) [ProposedControlNumber]
    From dbo.tblMaster mstr1
    where IsGlobalFamilyUnique = 1 and ControlNumber is null
)x

问题是当代码再次运行时ProposedGlobalFamilyUniqueID 将再次从1 开始。它应该从dbo.tblMasterProposedGlobalFamilyUniqueID 的最后一个值开始。我认为这是因为我将查询限制在ControlNumber is null 的位置,但我不知道如何解决这个问题。

这是第一次运行成功的代码示例:

最终结果应该是连续的ControlNumber 值,其中IsGlobalFamilyUnique = 1

示例数据

 declare @test table (
    ID bigint identity(1,1),
    GlobalFamilyUniqueID int,
    DupeIdentifier as cast('EDME' + RIGHT('00000000'+ISNULL(cast([ID] as nvarchar(max)),''),8) as nvarchar(30)),
    ControlNumber nvarchar(30),
    MD5Hash nvarchar(32),
    IsGlobalFamilyUnique bit
)

insert into @test (MD5Hash, IsGlobalFamilyUnique)values
--1
('ABC', 1),
--2
('DEF', 1),
--3
('GHI', 1),
--4
('JKL', 1),
--5
('ABC', 0),
--6
('XXX', 1)

结果应该是;

【问题讨论】:

  • 您能提供一些示例数据并期待结果吗?
  • @D-Shih 刚刚编辑以提供示例数据!

标签: sql-server tsql


【解决方案1】:

将ControlNumber字段保留为数字,尽量不要将其设为varchar,因为它将无法计算。

在尝试脚本之前首先删除所有现有的控制编号值。

那么,试试这个:

 DECLARE @max as bigint

 SELECT @max = Max(id)

 FROM tblMaster 


  Select [id],
        DupeIdentifier,
    --  ControlNumber,
        isglobalfamilyunique,
        --GlobalFamilyUniqueID,
        GlobalFamilyUniqueID,
        @max + Row_Number() Over(Order By [id]) [ProposedGlobalFamilyUniqueID],
        ControlNumber      
    From dbo.tblMaster mstr1
    where IsGlobalFamilyUnique = 1 and ControlNumber is null


   update x
    set 
    GlobalFamilyUniqueID = [ProposedGlobalFamilyUniqueID],
    ControlNumber =   x.Proposed_Control_Number

from(
    Select [id],
        DupeIdentifier,
    --  ControlNumber,
        isglobalfamilyunique,
        --GlobalFamilyUniqueID,
        GlobalFamilyUniqueID,
        Row_Number() Over(Order By [id]) [ProposedGlobalFamilyUniqueID],
        ControlNumber,
          @max + Row_Number() Over(Order By [id]) as Proposed_Control_Number   
    From dbo.tblMaster mstr1
    Where IsGlobalFamilyUnique = 1 and ControlNumber is null
)x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多