重新插入具有更新值的数据,同时保留一些列

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

我正在使用 SQL Server 数据库,我需要使用一些修改后的值更新和重新插入用户数据,同时保留其他现有值。这是数据结构和要求的简化版本:

现有数据:

  • Idx
    :用户的唯一标识符。
  • NetCode
    :需要更新的代码。
  • EncryptCode
    :保留
  • FirstName
    :保留。
  • AccessLevelIdx
    :表示用户级别
  • Email
    :保留
  • ParentIdx
    :父用户的
    UserIdx
    ,也应该更新

示例数据:

用户访问级别2

旧 IDx 旧网络代码 加密代码 名字 访问级别Idx 电子邮件 ParentIdx
44 AAAA12_爱丽丝 60A6A0BC07 爱丽丝 2 [电子邮件受保护] 15

用户访问级别3

旧 IDx 旧网络代码 加密代码 名字 访问级别Idx 电子邮件 ParentIdx
156 AAAA12_莎拉 F31CABEA06 莎拉 3 [电子邮件受保护] 44
176 AAAA12_大卫 67694FF1EA 大卫 3 [电子邮件受保护] 44

用户访问级别4

旧 IDx 旧网络代码 加密代码 名字 访问级别Idx 电子邮件 ParentIdx
1081 AAAA12_艾米丽 D0789701C0 艾米丽 4 [电子邮件受保护] 156
1990 AAAA12_约翰 61368D2FB5 约翰 4 [电子邮件受保护] 176

更新值:

  • Idx
    :更新的标识符。
  • NetCode
    :更新了网络代码。
  • ParentIdx
    :应参考更新后的
    UserIdx

新的重复用户AccessLevel2

用户Idx 网络代码 加密代码 名字 访问级别Idx 电子邮件 ParentIdx
2990 FFFF33_爱丽丝 60A6A0BC07 爱丽丝 2 [电子邮件受保护] 15

新的重复用户AccessLevel3

用户Idx 网络代码 加密代码 名字 访问级别Idx 电子邮件 ParentIdx
3101 FFFF33_莎拉 F31CABEA06 莎拉 3 [电子邮件受保护] 2990
3102 FFFF33_大卫 67694FF1EA 大卫 3 [电子邮件受保护] 2990

新的重复用户AccessLevel4

用户Idx 网络代码 加密代码 名字 访问级别Idx 电子邮件 ParentIdx
4101 FFFF33_艾米丽 D0789701C0 艾米丽 4 [电子邮件受保护] 3101
5012 FFFF33_约翰 61368D2FB5 约翰 4 [电子邮件受保护] 3102

尝试 SQL 脚本:这是我到目前为止所拥有的(

Idx
是唯一标识符)

INSERT INTO Users (NetCode, EncryptCode, FirstName, AccessLevelIdx, Email, ParentIdx)
    SELECT 
        'FFFF33_' + SUBSTRING(NetCode, CHARINDEX('_', NetCode) + 1, LEN(NetCode) - CHARINDEX('_', NetCode)),
        EncryptCode,
        FirstName,
        AccessLevelIdx,
        Email,
        ParentIdx
    FROM 
        Users
    WHERE 
        NetCode LIKE '%AAAA12_%' AND AccessLevelIdx = 2


INSERT INTO Users (NetCode, EncryptCode, FirstName, AccessLevelIdx, Email, ParentIdx)
    SELECT 
        'FFFF33_' + SUBSTRING(p.NetCode, CHARINDEX('_', p.NetCode) + 1, LEN(p.NetCode) - CHARINDEX('_', p.NetCode)),
        p.EncryptCode,
        p.FirstName,
        p.AccessLevelIdx,
        p.Email,
        p.ParentIdx
    FROM 
        Users p
    JOIN 
        Users d on p.ParentIdx = d.Idx
    WHERE 
        NetCode LIKE '%AAAA12_%' 
        AND p.AccessLevelIdx = 3 
        AND d.AccessLevelIdx = 2

有人可以帮助我编写查询以实现所需的输出吗?

sql sql-server
1个回答
0
投票

尝试这个

完整查询如下:

Create Table #Users (Idx INT IDENTITY(1,1) , NetCode varchar(20), EncryptCode varchar(20), FirstName varchar(15), AccessLevelIdx Int, Email varchar(25), ParentIdx Int )

Insert Into #Users  
Select   'AAAA12_Alice' NetCode, '60A6A0BC07' EncryptCode, 'Alice' FirstName, 2 AccessLevelIdx, '[email protected]' Email, 15 ParentIdx Union
Select  'AAAA12_Sarah' NetCode, 'F31CABEA06' EncryptCode, 'Sarah' FirstName, 3 AccessLevelIdx, '[email protected]' Email, 44 ParentIdx Union
Select  'AAAA12_David' NetCode, '67694FF1EA' EncryptCode, 'David' FirstName, 3 AccessLevelIdx, '[email protected]' Email, 44 ParentIdx Union
Select  'AAAA12_Emily' NetCode, 'D0789701C0' EncryptCode, 'Emily' FirstName, 4 AccessLevelIdx, '[email protected]' Email, 156 ParentIdx Union
Select  'AAAA12_John' NetCode, '61368D2FB5' EncryptCode, 'John' FirstName, 4 AccessLevelIdx, '[email protected]' Email, 176 ParentIdx  

Select * from #Users
 
INSERT INTO #Users 
SELECT 'FFFF33_' + SUBSTRING(NetCode, CHARINDEX('_', NetCode) + 1, LEN(NetCode) - CHARINDEX('_', NetCode))  NetCode,
        EncryptCode,
        FirstName,
        AccessLevelIdx,
        Email,
        ParentIdx
    FROM 
        #Users
    WHERE 
        NetCode LIKE '%AAAA12_%' AND AccessLevelIdx = 2


;With  acl3 as 
(
Select 'FFFF33_' + SUBSTRING(NetCode, CHARINDEX('_', NetCode) + 1, LEN(NetCode) - CHARINDEX('_', NetCode))  NetCode,
        EncryptCode,
        FirstName,
        p.AccessLevelIdx,
        Email,
        d.Idx ParentIdx
FROM  #Users  p
    INNER JOIN (Select Idx, AccessLevelIdx from #Users Where NetCode LIKE '%FFFF33_%' ) d on (p.AccessLevelIdx - d.AccessLevelIdx) = 1
    WHERE 
         p.NetCode LIKE '%AAAA12_%' 
        AND p.AccessLevelIdx = 3
)
 
INSERT INTO #Users
Select * from acl3 Where ParentIdx is NOT NULL

;With acl4 as 
(
Select 'FFFF33_' + SUBSTRING(NetCode, CHARINDEX('_', NetCode) + 1, LEN(NetCode) - CHARINDEX('_', NetCode))  NetCode,
        EncryptCode,
        FirstName,
        p.AccessLevelIdx,
        Email,
        d.Idx ParentIdx
FROM  #Users  p
    INNER JOIN (Select Idx, AccessLevelIdx from #Users Where NetCode LIKE '%FFFF33_%' ) d on (p.AccessLevelIdx - d.AccessLevelIdx) = 1
    WHERE 
         p.NetCode LIKE '%AAAA12_%' 
        AND p.AccessLevelIdx = 4
)
 
INSERT INTO #Users
Select * from acl4 

Select * from #Users

Drop Table #Users
© www.soinside.com 2019 - 2024. All rights reserved.