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