这是类似于 Thorsten 的递归解决方案。只是提供另一个例子。
WITH ranges(id, a, b) AS (
SELECT 1, 0, 40 UNION
SELECT 2, 40, 60 UNION
SELECT 3, 80, 100 UNION
SELECT 4, 10, 30
), tests(id, a, b) AS
(
SELECT 1 as id, 10 as a, 90 as b
UNION
SELECT 2, 10, 60
), rangeFinder(a, b, ra, rfb) AS
(
SELECT a, b, 0 AS ra, 0 AS rfb
FROM ranges AS r
UNION ALL
SELECT rangeFinder.a, ranges.b, ranges.a, rangeFinder.b
FROM ranges
JOIN rangeFinder
ON ranges.b > rangeFinder.b
AND ranges.a <=rangeFinder.b
), islands(a, b) AS
(
SELECT a, b
FROM rangeFinder
WHERE a NOT IN (SELECT ra FROM rangeFinder)
AND b NOT IN (SELECT rfb FROM rangeFinder)
)
SELECT t.id, t.a, t.b FROM
tests t
JOIN islands i
ON t.a >= i.a
AND t.b <= i.b
演示在这里:http://rextester.com/HDQ52126 http://rextester.com/HDQ52126