如何在 SQL Server 中保留某些列的同时重新插入具有更新值的数据?

问题描述 投票: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
投票

正如你提到的

重新插入具有某些修改值的用户数据,同时保留其他值 现有的价值观。

您可以尝试以下操作,仅修改“设置”新值的预期字段,并保留其他字段保留相同的值。

Update Users 
SET NetCode = 'FFFF33_' + SUBSTRING(NetCode, CHARINDEX('_', NetCode) + 1, LEN(NetCode) - CHARINDEX('_', NetCode))
, EncryptCode = '60A6A0BC07'
, ...
, ...
WHERE NetCode LIKE '%AAAA12_%' AND AccessLevelIdx = 2

Update p
SET p.NetCode = 'FFFF33_' + SUBSTRING(p.NetCode, CHARINDEX('_', p.NetCode) + 1, LEN(p.NetCode) - CHARINDEX('_', p.NetCode))
  , p.EncryptCode = '60A6A0BC07'
  , ...
  , ...
FROM Users p
    INNER JOIN 
        Users d on p.ParentIdx = d.Idx
    WHERE 
        NetCode LIKE '%AAAA12_%' 
        AND p.AccessLevelIdx = 3 
        AND d.AccessLevelIdx = 2
© www.soinside.com 2019 - 2024. All rights reserved.