Sql server 关系划分:查找每个“关系”的唯一集合;“儿童”;列中的值

Sql server 关系划分:查找每个“关系”的唯一集合;“儿童”;列中的值,sql-server,tsql,relational-division,Sql Server,Tsql,Relational Division,经过大量搜索,似乎大多数关系划分问题都是针对具有匹配成员的目标群体。也许我的关键字有问题,但我想要的是一些不同的东西:给定一个父/组和一组子/成员,我如何找到每个成员的唯一组合,而不考虑父/组 使用以下示例源 CREATE TABLE #m (Parent char(1), ChildID int) INSERT INTO #m VALUES ('a',1), ('a', 2), ('a',4), ('b',1), ('b', 3), ('b',4), ('c',1

经过大量搜索,似乎大多数
关系划分
问题都是针对具有匹配成员的目标群体。也许我的关键字有问题,但我想要的是一些不同的东西:给定一个父/组和一组子/成员,我如何找到每个成员的唯一组合,而不考虑父/组

使用以下示例源

CREATE TABLE #m (Parent char(1), ChildID int)

INSERT INTO #m
VALUES ('a',1), ('a', 2), ('a',4),
       ('b',1), ('b', 3), ('b',4),
       ('c',1), ('c', 4), ('c',2),
       ('d',1), ('d',4),
       ('e',3), ('e', 1),
       ('f',4),
       ('g',3), ('g', 4), ('g',1);

SELECT * FROM #m
我将寻找一个像(1,2,4),(1,3,4),(1,4),(1,3),(4)这样的结果,表示为一个新的临时表(连接回
#m
,这样每个
父项
都可以指向其“哈希”,而不是其匹配的
父项

这东西上有很多东西;对我来说是最有意义的,但我还没有找到答案。抱歉,我找不到重复的内容

编辑:以SQL结果集表示的所需结果:

UParent ChildID
------- -----------
u1      1
u1      2
u1      4
u2      1
u2      3
u2      4
u3      1
u3      4
u4      1
u4      3
u5      4

如果我错了,请纠正我,您的数据存储方式是否已达到您希望的格式

我从给定的样本数据中尝试了这个查询,它生成了您期望的结果集。看看这里

SELECT 'u' + CAST(DENSE_RANK() OVER (ORDER BY Parent) AS VARCHAR(10)) AS UParent
      ,ChildID
FROM #m
结果集

╔═════════╦═════════╗
║ UParent ║ ChildID ║
╠═════════╬═════════╣
║ u1      ║       1 ║
║ u1      ║       2 ║
║ u1      ║       4 ║
║ u2      ║       1 ║
║ u2      ║       3 ║
║ u2      ║       4 ║
║ u3      ║       1 ║
║ u3      ║       4 ║
║ u3      ║       2 ║
║ u4      ║       1 ║
║ u4      ║       4 ║
║ u5      ║       3 ║
║ u5      ║       1 ║
║ u6      ║       4 ║
║ u7      ║       3 ║
║ u7      ║       4 ║
║ u7      ║       1 ║
╚═════════╩═════════╝
我明白了,你想要孩子们的“独特”组合,不管顺序如何

以下是等效的父级:

select m1.Parent as Parent1, m2.Parent as Parent2
from (select m.*, count(*) over (partition by Parent) as NumKids
      from #m m
     ) m1 join
     (select m.*, count(*) over (partition by Parent) as NumKids
      from #m m
     ) m2
     on m1.ChildID = m2.ChildID
group by m1.Parent, m2.Parent
having count(*) = max(m1.NumKids) and max(m1.NumKids) = max(m2.NumKids);
我们现在可以用这个得到你想要的

with parents as (
    select m1.Parent as Parent1, m2.Parent as Parent2
    from (select m.*, count(*) over (partition by Parent) as NumKids
          from #m m
         ) m1 join
         (select m.*, count(*) over (partition by Parent) as NumKids
          from #m m
         ) m2
         on m1.ChildID = m2.ChildID
    group by m1.Parent, m2.Parent
    having count(*) = max(m1.NumKids) and max(m1.NumKids) = max(m2.NumKids)
)
select distinct m.*
from (select min(Parent2) as theParent
      from parents
      group by Parent1
     ) p join
     #m m
     on p.theParent = m.Parent;
如果需要新id而不是旧id,请使用:

select dense_rank() over (partition by m.Parent) as NewId, m.ChildID

中选择

这将使用
for xml
构建一个排序的子id列表,该列表用作rank()函数的分区子句

select M.Parent,
       M.ChildID
from (
     select M1.Parent,
            M1.ChildID,
            rank() over(partition by (
                                     select cast(ChildID as varchar(11))+','
                                     from #m as M2
                                     where M1.Parent = M2.Parent
                                     order by M2.ChildID
                                     for xml path('')
                                     )
                        order by M1.Parent) as rn
     from #m as M1
     ) as M
where M.rn = 1;

该结果基于什么?你能更好地描述一下你需要什么吗?结果应该是什么样的呢?SQL表有固定数量的列。@GordonLinoff它是基于用眼睛读取值集,然后列出它们。这样表达是因为我不喜欢伪造无法获得的SQL结果,但我会这样做。“我如何找到每个成员的独特组合,而不考虑其父母?”这不是我需要的一个很好的描述吗?是否有最大数量的子成员?@GordonLinoff理论上说,没有,但在我的具体/当前实现中,它远低于100。你在学习吗?谢谢,这里面有一点不好的语法(额外的
join#m m2
)对于那些遵循原始代码的人,parentId=>Parent和child=>ChildID。我指的是数学意义上的“独特组合”,是的,不管顺序如何。在你脑子里,没有CTE有没有办法做到这一点?@downwitch。我认为这些都是固定的,但听起来你已经让它工作了。是的,一旦我做了这些更改,你的解决方案就工作了。我编辑了我的最后一条评论(输入得太早了),问了一个问题:在没有CTE的情况下,有没有办法做到这一点?@downwitch。对CTE只能插在
父级
引用所在的位置。这是一个CTE。将坚持接受,以查看是否有其他人提供了其他解决方案,谢谢。不,因为在您的结果中,u1和u3(例如)具有相同的成员。每一组成员的一个实例就是目标。