在表中查找相同的串联记录

时间:2019-07-09 16:27:29

标签: sql sql-server

我有一个表,其中包含基于此信息的email,gruppe作为字段,我想查找具有相同成员身份(相同gruppe)的所有用户,因此我可以将他们分组到positions表中的位置。 gruppe是唯一的活动目录组名称。

CREATE TABLE [dbo].[tblsource] (
    [Id]     INT           IDENTITY (1, 1) NOT NULL,
    [email]  VARCHAR (150) NULL,
    [gruppe] VARCHAR (150) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[tblpositions] (
    [Id]          INT           IDENTITY (1, 1) NOT NULL,
    [email]       VARCHAR (150) NULL,
    [position] VARCHAR (150) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

我实际上想在位置上写一个哈希或类似的东西(如果所有组都相同,则必须相同)。 这将使我能够轻松地识别出所有具有相同粗暴行为的人。 考虑到我必须从电子表格中加载数据的事实,对此表示赞赏(也是不同的方法)。

tblsource(样本数据):

user1@company.com,security-group1  
user1@company.com,security-group89  
user84@company.com,security-group89  
user3@company.com,security-group986  
user84@company.com,security-group1 

所以user1和user84具有相同的成员身份,因此共享一个职位

1 个答案:

答案 0 :(得分:0)

要查找具有相同成员身份的相同用户,可以尝试以下代码。

;WITH cte_membership(email,membership)
AS
(
    SELECT  u.email,
        STUFF(
            (
                SELECT N','+m.[group]                   
                FROM dbo.tblsource m
                WHERE m.email=u.email
                ORDER BY m.[group]
                FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
        ,1,1,'') AS membership
    FROM dbo.tblsource u
    GROUP BY u.[email]
),
cte_m(membership)
AS
(
    SELECT m.membership
    FROM cte_membership m
    GROUP BY m.membership
    HAVING COUNT(*)>1
)
SELECT a.membership, b.email
FROM cte_m a
INNER JOIN cte_membership b
ON a.membership=b.membership;