【发布时间】:2010-09-18 05:19:18
【问题描述】:
有人可以告诉我如何使用 SQL 获取以不同方式相交的三行的不同段吗? #t2 中的三行代表集合 A、B、C - 我正在寻找 AIB、AIC、BIC、AIBIC、A'、B'、C' 等,(在维恩图中有 3 行的 7 个可能段) I 是交叉口。
我正在寻找一个通用解决方案,它可以处理 #t2 中的 n 行。
-- SQL Code Begin
create table #t1 (key1 int, key2 int) -- for each Key1 there can be 1 or more Key2
go
create table #t2 (row_id int identity(101, 1), key1 int) --row_id is the primary key
go
insert into #t1
select 1, 11 union select 1, 12 union select 1, 13 union select 1, 14 union
select 2, 13 union select 2, 15 union select 2, 16 union select 2, 17 union
select 3, 13 union select 3, 12 union select 3, 16 union select 3, 17
-- 1 --> 11, 12, 13, 14
-- 2 --> 13, 15, 16, 17
-- 3 --> 13, 12, 16, 17
insert into #t2 (key1)
select 1 union select 2 union select 3
-- SQL Code End
我正在寻找的输出是,
1001 11 (A')
1001 14 (A')
1002 12 (A I C - A I B I C)
1003 13 (A I B I C)
1004 15 (B')
1005 16 (B I C - A I B I C)
1005 17 (B I C - A I B I C)
输出有 5 个段,而不是可能的 7 个段,因为其中两个为 NULL。
【问题讨论】:
-
您可能想要编辑您的问题以删除实际不是代码的部分之前的空格。真的很难按原样阅读这里的内容。
-
帮助我理解你的问题。字母是从哪里来的?你真的想要结果中的字母吗?如果是这样,分配它们的规则是什么?另外,我不明白数字 12、16 和 17 的输出,为什么在结果中包含 A、B 和 C 的交集?
-
如果我可以改写您的问题,这是否准确?您需要 #t1.key2 中的每个不同值以及它们所属的 #t2 中的哪些记录。
-
我正在寻找的是当 A、B 和 C 相交时所有可能的不同段(如在维恩图中)。其中一些段可能为 NULL。
-
我真的不需要结果中的字母。我只是想展示结果的来源。 12 - 它是 A 和 C 的交集减去三个项目之间的公共交集。尽管我的示例是 3 行,但我正在寻找一种通用解决方案来解决更大的行数。