转换并重复多行

时间:2018-06-28 23:09:28

标签: sql-server tsql

我有一个表,表中有两个ID,分别是FamilyID和PersonID。我需要能够使用所有组合重复这些行,如下面的屏幕快照所示,其中指出每个数字都会多排一行。

enter image description here

这里有一些SQL创建带有一些示例数据的表。没有可能发生的设定次数。

有人知道我们将如何实现吗?

CREATE TABLE #TempStackOverflow
(
    FamilyID int,
    PersonID int
)

insert into #TempStackOverflow
(
    FamilyID,
    PersonID
)
select
    1012,
    1
union
select
    1013,
    1
union
select
    1014,
    1
union
select
    1015,
    2
union
select
    14774,
    3
union
select
    1019,
    5

2 个答案:

答案 0 :(得分:2)

我了解您需要在组内提供某种完整的匹配列表,但是说实话,如果您首先使用简单的英语来解释业务环境,那就更好了。

以下查询似乎会产生您的示例结果:

with cte as (
    select a.FamilyID, a.PersonID, a.PersonID as [GroupId] from #TempStackOverflow a
    union all
    select b.PersonID, b.FamilyID, b.PersonID from #TempStackOverflow b
)
select distinct c.FamilyID, s.PersonID
from cte c
    inner join cte s on s.GroupId = c.GroupId
where c.FamilyID != s.PersonID;

答案 1 :(得分:1)

这是我可以想到的最简单的版本,与上面的操作一样,它按PersonId将项目分组。显然,如果您不希望这样做,则可以删除外部查询。

SELECT FamilyId,
    PersonID
FROM (
    SELECT FamilyId, PersonId, PersonID as SortBy
    FROM #TempStackOverflow t1
    UNION
    SELECT PersonId, FamilyId, PersonId as SortBy
    FROM #TempStackOverflow t1
    UNION
    SELECT t1.FamilyID, t2.FamilyID, t1.PersonID as SortBy
    FROM #TempStackOverflow t1
    FULL OUTER JOIN #TempStackOverflow t2
        ON t1.PersonID = t2.PersonID
    WHERE t1.FamilyID != t2.FamilyID
    ) as Src
ORDER BY SortBy