我正在使用 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
有人可以帮助我编写查询以实现所需的输出吗?
正如你提到的
重新插入具有某些修改值的用户数据,同时保留其他值 现有的价值观。
您可以尝试以下操作,仅修改“设置”新值的预期字段,并保留其他字段保留相同的值。
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