2013-10-11 33 views
3

我有一个有数字范围列表的表。我需要知道,如果这些号码的范围重叠海誓山盟SQL-做任何数字范围重叠

SQL Fiddle here

例如,最后两行的小提琴重叠海誓山盟。我不确定你会如何在查询结果中显示。

任何帮助,将不胜感激。

编辑:如果不知道这会工作,但似乎是:

SELECT 
    * 
FROM 
(
    SELECT 
    FROM_NUM, 
    TO_NUM, 
    LEAD(FROM_NUM) OVER (ORDER BY FROM_NUM) A 
    FROM 
    RANGES 
) RANGES 
WHERE 
    A < TO_NUM 
+0

在技术上并不'INSERT INTO范围内的值(2501,2501)'重叠呢? –

+0

他们与彼此重叠,但不是其他行,所以我不关心这些。 – Lock

回答

0
SELECT RANGES.FROM_NUM AS BASE_FROM_NUM, RANGES.TO_NUM AS BASE_TO_NUM, 
    OVERLAP.FROM_NUM AS OVERLAP_FROM_NUM, OVERLAP.TO_NUM AS OVERLAP_TO_NUM 
FROM RANGES 
INNER JOIN RANGES OVERLAP 
ON (((OVERLAP.FROM_NUM <= RANGES.FROM_NUM) AND (OVERLAP.TO_NUM >= RANGES.FROM_NUM)) 
OR ((OVERLAP.FROM_NUM <= RANGES.TO_NUM) AND (OVERLAP.TO_NUM >= RANGES.TO_NUM))) 
AND ((OVERLAP.FROM_NUM <> RANGES.FROM_NUM) AND (OVERLAP.TO_NUM <> RANGES.TO_NUM)) 

最后一行才停止行报告重叠自己。在实践中,您将使用唯一的密钥删除它们(以防万一你有相同的重复的行从/到数字):

AND (OVERLAP.ID <> RANGES.ID)