我正在使用 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
有人可以帮助我编写查询以实现所需的输出吗?
尝试这个
完整查询如下:
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