Учитывая 2 таблицы, как объединить их в представление? - PullRequest
2 голосов
/ 10 июля 2020

Учитывая следующую ADuser таблицу:

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|

как мне объединить их в представление, чтобы в итоге получилось что-то вроде этого, где оргкоды объединены под одним совпадающим идентификатором пользователя?

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, все коды организаций в этих 2 группах для пользователя user1 объединяются в 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|

Ответы [ 3 ]

3 голосов
/ 10 июля 2020

, где orgcodes объединены под 1 совпадающим идентификатором пользователя?

Вам нужно будет использовать STRING_AGG, который доступен только в SQL Server 2017 или более поздней версии .

Этот запрос также использует TRIM() на входе [Org Codes] значение, чтобы помочь предотвратить появление '||' на выходе, когда существующие строки объединяются вместе.

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;

Это сказал, как правило, денормализовать данные таким образом - плохая идея. Вы должны возвращать клиентам данные, ориентированные на строки, и денормализовать данные только на уровне пользовательского интерфейса.

1 голос
/ 10 июля 2020

вы можете попробовать ниже:

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
1 голос
/ 10 июля 2020

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...