我有以下两个表,表 A 和表 B。
我想要做的是返回一个结果集,其中:
如果表 B 中的开始位置(仅)在表 A 中任何行的开始和结束位置之间,那么我不希望表 B 中的该行出现在结果集中。
如果表 A 中的任何开始和结束位置位于表 B 中任何行的任何开始和结束位置之间,那么我不希望表 A 中的该行。
这是表A:
RID | 起始位置 | EndPos |
---|---|---|
7 | 45 | 77 |
7 | 118 | 130 |
7 | 197 | 212 |
7 | 218 | 235 |
这是表B:
RID | 起始位置 | EndPos |
---|---|---|
7 | 83 | 87 |
7 | 121 | 132 |
7 | 175 | 179 |
7 | 183 | 191 |
7 | 195 | 214 |
7 | 221 | 237 |
这是我想要的结果集。您可以看到表 A 中的 197 和 212 位于表 B 中具有 195 和 214 的行之间,因此表 A 中的行不在结果集中。您还可以看到,表 B 中的起始位置 221 位于表 A 中的范围 (218, 235) 之间,因此表 B 中的行也不在结果集中。
RID | 起始位置 | EndPos |
---|---|---|
7 | 45 | 77 |
7 | 83 | 87 |
7 | 118 | 130 |
7 | 175 | 179 |
7 | 183 | 191 |
7 | 195 | 214 |
7 | 218 | 235 |
总之,我想排除在哪里:
- 表 A 的开始位置和结束位置在表 B 的任何开始位置和结束位置之间。
- 表 B 的开始位置介于表 A 的任何开始位置和结束位置之间。
此外,表中有多个 RID... 我认为(并且仍然认为)我可以使用 FULL 连接(或者可能使用 APPLY)来完成这项工作,但我有点卡住了,这就是为什么我求大家帮忙!
这是生成两个表的 T-SQL:
CREATE TABLE #TableA(
RID int NULL,
StartPos int NULL,
EndPos int NULL
)
INSERT #TableA (RID, StartPos, EndPos) VALUES (7, 45, 77)
INSERT #TableA (RID, StartPos, EndPos) VALUES (7, 118, 130)
INSERT #TableA (RID, StartPos, EndPos) VALUES (7, 197, 212)
INSERT #TableA (RID, StartPos, EndPos) VALUES (7, 218, 235)
CREATE TABLE #TableB(
RID int NULL,
StartPos int NULL,
EndPos int NULL
)
INSERT #TableB (RID, StartPos, EndPos) VALUES (7, 83, 87)
INSERT #TableB (RID, StartPos, EndPos) VALUES (7, 121, 132)
INSERT #TableB (RID, StartPos, EndPos) VALUES (7, 175, 179)
INSERT #TableB (RID, StartPos, EndPos) VALUES (7, 183, 191)
INSERT #TableB (RID, StartPos, EndPos) VALUES (7, 195, 214)
INSERT #TableB (RID, StartPos, EndPos) VALUES (7, 221, 237)
SELECT *
FROM #TableA
SELECT *
FROM #TableB
根据你的问题,我认为这就是你想要的:
小提琴