从另一个表中选择Range之间的记录

时间:2016-02-02 08:44:59

标签: sql sql-server sql-server-2008

我有两张表,比如Table1Table2

表1

╔════╦════╗
║ ID ║ RN ║
╠════╬════╣
║ 11 ║ 1  ║
║ 12 ║ 2  ║
║ 13 ║ 3  ║
║ 14 ║ 4  ║
║ 15 ║ 5  ║
║ 16 ║ 6  ║
║ 17 ║ 7  ║
║ 18 ║ 8  ║
║ 19 ║ 9  ║
║ 10 ║ 10 ║
╚════╩════╝

表2

╔════╦════════╦══════╗
║ ID ║ FromRN ║ ToRN ║
╠════╬════════╬══════╣
║  1 ║    1   ║  3   ║
║  2 ║    6   ║  8   ║  
║  3 ║    10  ║  10  ║
╚════╩════════╩══════╝

我希望Table1 RN位于FromRN之间的ToRNTable2之间的所有记录╔════╦════╗ ║ ID ║ RN ║ ╠════╬════╣ ║ 11 ║ 1 ║ ║ 12 ║ 2 ║ ║ 13 ║ 3 ║ ║ 16 ║ 6 ║ ║ 17 ║ 7 ║ ║ 18 ║ 8 ║ ║ 10 ║ 10 ║ ╚════╩════╝

所以我的预期输出是:

{{1}}

可以在这里找到创建模式的SQLFiddle:

http://sqlfiddle.com/#!3/90d50

3 个答案:

答案 0 :(得分:9)

您可以执行这两个表中的INNER JOIN来过滤Table1 RN值不属于Table2范围内任何范围的记录:

SELECT t1.ID, t1.RN
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.RN >= t2.FromRN AND t1.RN <= t2.ToRN

按照以下链接进行正在运行的演示(由OP提供):

SQLFiddle

答案 1 :(得分:5)

你可以试试这个:

select t1.Id, t1.RN
from table1 t1
inner join table2 t2
on t1.Rn between t2.FromRn and t2.ToRn

答案 2 :(得分:3)

另一个解决方案是使用EXISTS -

SELECT
*
FROM table1 t1
WHERE EXISTS (SELECT 1 FROM table2
    WHERE t1.rn >= FromRN
    AND t1.rn <= ToRN)

<强>结果

| ID | RN |
|----|----|
| 11 |  1 |
| 12 |  2 |
| 13 |  3 |
| 16 |  6 |
| 17 |  7 |
| 18 |  8 |
| 20 | 10 |