给定 2 个表,如何将它们合并为一个视图?
Given 2 tables, how to consolidate them into a view?
给出以下 ADuser table:
AD Group UserID
Group1 User1
Group2 User2
Group3 User1
Group3 User3
和Group_Access table:
AD Group Org Codes
Group1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|
Group2 123_KL|Z45557|f908L_P|
Group3 12345|
我如何将它们整合到一个视图中,以便我们最终得到这样的结果,其中 orgcodes 合并在 1 个匹配的用户 ID 下?
UserID Org Codes
User1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|12345|
User2 123_KL|Z45557|f908L_P|
User3 12345|
请注意,由于 User1 属于多个组,即 Group1 和 Group3,因此在最终视图中,user1 的这 2 个组中的所有组织代码都合并到 1 中,附加额外的 12345|
组织代码
到目前为止我尝试过的:
CREATE VIEW UserOrgCodesView
AS SELECT ADuser.UserID, Group_Access.[Org Codes]
FROM ADuser
INNER JOIN Group_Access ON ADuser.[AD Group]=Group_Access.[AD Group];
但是这在后面产生了
UserID Org Codes
User1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|12345|
User2 123_KL|Z45557|f908L_P|
User1 12345|
User3 12345|
where the orgcodes are combined under 1 matching userid?
You'll need to use STRING_AGG
which is only available in SQL Server 2017 or later.
此查询还在输入 [Org Codes]
值上使用 TRIM()
以帮助防止 '||'
在现有字符串连接在一起时出现在输出中。
SELECT
u.UserId,
STRING_AGG( TRIM( '|' FROM g.[Org Codes] ), '|' ) AS [Org Codes]
FROM
ADuser AS u
INNER JOIN Group_Access AS g ON u.[AD Group] = g.[AD Group]
GROUP BY
u.UserId;
也就是说,像这样对数据进行非规范化通常不是一个好主意。您应该 return 向客户端提供面向行的数据,并且只对 UI 层中的数据进行反规范化。
您可以使用 STRING_AGG
(如果 SQL Server 2017 之后)或 XML PATH
(如果在 SQL Server 2017 之前)。
CREATE TABLE aduser (ADGroup SYSNAME, UserID sysName)
create table group_access (ADgroup sysname, OrgCodes VARCHAR(4000))
insert into aduser values
('Group1','User1'),
('Group2','User1');
insert into group_access values
('Group1','M500_ABC|1098|123_KL|Z45557|f908L_P|234G|'),
('Group2',' 123_KL|Z45557|f908L_P|')
CREATE VIEW UserOrgCodesView_SQL2017onwards
AS
SELECT ad.UserID, STRING_AGG(gc.OrgCodes,'') as Orgcodes
FROM aduser as ad
inner join group_access as gc
on gc.ADGroup = ad.ADGroup
group by ad.UserID
CREATE VIEW UsersOrgCodesView_Before2017
as
SELECT oad.UserID, STUFF((SELECT gc.OrgCodes+'' FROM group_access as gc
inner join aduser as ad
on gc.ADGroup = ad.ADGroup
where ad.UserID = oad.UserID
FOR XML PATH('')),1,0,'') as Orgcodes
FROM aduser as oad
group by Oad.UserID
您可以尝试以下操作:
CREATE TABLE TmpTblADUser (GroupName VARCHAR(10), UserID VARCHAR(10));
INSERT INTO TmpTblGroupAccess VALUES
('Group1', 'M500_ABC|1098|123_KL|Z45557|f908L_P|234G|'),
('Group2', '123_KL|Z45557|f908L_P|'),
('Group3', '12345|')
CREATE TABLE TmpTblGroupAccess (GroupName VARCHAR(10), OrgCodes VARCHAR(1000));
INSERT INTO TmpTblGroupAccess VALUES
('Group1', 'M500_ABC|1098|123_KL|Z45557|f908L_P|234G|'),
('Group2', '123_KL|Z45557|f908L_P|'),
('Group3', '12345|')
CREATE VIEW UserOrgCodesView
AS SELECT u.UserID, g.OrgCodes
FROM TmpTblADUser u
INNER JOIN TmpTblGroupAccess g ON u.GroupName = g.GroupName;
SELECT t.UserID,
STUFF((SELECT OrgCodes + '' FROM UserOrgCodesView WHERE UserID = t.UserID FOR XML PATH ('')), 1, 0, '') AS GrupList
FROM UserOrgCodesView t
GROUP BY t.UserID
给出以下 ADuser table:
AD Group UserID
Group1 User1
Group2 User2
Group3 User1
Group3 User3
和Group_Access table:
AD Group Org Codes
Group1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|
Group2 123_KL|Z45557|f908L_P|
Group3 12345|
我如何将它们整合到一个视图中,以便我们最终得到这样的结果,其中 orgcodes 合并在 1 个匹配的用户 ID 下?
UserID Org Codes
User1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|12345|
User2 123_KL|Z45557|f908L_P|
User3 12345|
请注意,由于 User1 属于多个组,即 Group1 和 Group3,因此在最终视图中,user1 的这 2 个组中的所有组织代码都合并到 1 中,附加额外的 12345|
组织代码
到目前为止我尝试过的:
CREATE VIEW UserOrgCodesView
AS SELECT ADuser.UserID, Group_Access.[Org Codes]
FROM ADuser
INNER JOIN Group_Access ON ADuser.[AD Group]=Group_Access.[AD Group];
但是这在后面产生了
UserID Org Codes
User1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|12345|
User2 123_KL|Z45557|f908L_P|
User1 12345|
User3 12345|
where the orgcodes are combined under 1 matching userid?
You'll need to use STRING_AGG
which is only available in SQL Server 2017 or later.
此查询还在输入 [Org Codes]
值上使用 TRIM()
以帮助防止 '||'
在现有字符串连接在一起时出现在输出中。
SELECT
u.UserId,
STRING_AGG( TRIM( '|' FROM g.[Org Codes] ), '|' ) AS [Org Codes]
FROM
ADuser AS u
INNER JOIN Group_Access AS g ON u.[AD Group] = g.[AD Group]
GROUP BY
u.UserId;
也就是说,像这样对数据进行非规范化通常不是一个好主意。您应该 return 向客户端提供面向行的数据,并且只对 UI 层中的数据进行反规范化。
您可以使用 STRING_AGG
(如果 SQL Server 2017 之后)或 XML PATH
(如果在 SQL Server 2017 之前)。
CREATE TABLE aduser (ADGroup SYSNAME, UserID sysName)
create table group_access (ADgroup sysname, OrgCodes VARCHAR(4000))
insert into aduser values
('Group1','User1'),
('Group2','User1');
insert into group_access values
('Group1','M500_ABC|1098|123_KL|Z45557|f908L_P|234G|'),
('Group2',' 123_KL|Z45557|f908L_P|')
CREATE VIEW UserOrgCodesView_SQL2017onwards
AS
SELECT ad.UserID, STRING_AGG(gc.OrgCodes,'') as Orgcodes
FROM aduser as ad
inner join group_access as gc
on gc.ADGroup = ad.ADGroup
group by ad.UserID
CREATE VIEW UsersOrgCodesView_Before2017
as
SELECT oad.UserID, STUFF((SELECT gc.OrgCodes+'' FROM group_access as gc
inner join aduser as ad
on gc.ADGroup = ad.ADGroup
where ad.UserID = oad.UserID
FOR XML PATH('')),1,0,'') as Orgcodes
FROM aduser as oad
group by Oad.UserID
您可以尝试以下操作:
CREATE TABLE TmpTblADUser (GroupName VARCHAR(10), UserID VARCHAR(10));
INSERT INTO TmpTblGroupAccess VALUES
('Group1', 'M500_ABC|1098|123_KL|Z45557|f908L_P|234G|'),
('Group2', '123_KL|Z45557|f908L_P|'),
('Group3', '12345|')
CREATE TABLE TmpTblGroupAccess (GroupName VARCHAR(10), OrgCodes VARCHAR(1000));
INSERT INTO TmpTblGroupAccess VALUES
('Group1', 'M500_ABC|1098|123_KL|Z45557|f908L_P|234G|'),
('Group2', '123_KL|Z45557|f908L_P|'),
('Group3', '12345|')
CREATE VIEW UserOrgCodesView
AS SELECT u.UserID, g.OrgCodes
FROM TmpTblADUser u
INNER JOIN TmpTblGroupAccess g ON u.GroupName = g.GroupName;
SELECT t.UserID,
STUFF((SELECT OrgCodes + '' FROM UserOrgCodesView WHERE UserID = t.UserID FOR XML PATH ('')), 1, 0, '') AS GrupList
FROM UserOrgCodesView t
GROUP BY t.UserID