Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据范围类型确定重叠数范围?_Sql_Sql Server - Fatal编程技术网

Sql 如何根据范围类型确定重叠数范围?

Sql 如何根据范围类型确定重叠数范围?,sql,sql-server,Sql,Sql Server,我有两个表Table1记录列表和Table2我要检查的编号范围 考虑到TypeId,如何识别表2中的重叠范围/行 客观的 此外, 用于上述表的SQL 请建议: 非常感谢 检查两个范围是否重叠的方法是测试一个范围是否在另一端之前开始,而另一个范围是否在第一个端点之前开始。 SELECT DISTINCT m.*, CASE ISNULL(t.typeId,0) WHEN 0 THEN 'NO' ELSE 'YES' END AS IsOverlapping FROM #MyRanges m

我有两个表Table1记录列表和Table2我要检查的编号范围

考虑到TypeId,如何识别表2中的重叠范围/行

客观的

此外,

用于上述表的SQL

请建议:


非常感谢

检查两个范围是否重叠的方法是测试一个范围是否在另一端之前开始,而另一个范围是否在第一个端点之前开始。
SELECT DISTINCT m.*,
CASE ISNULL(t.typeId,0) WHEN 0 THEN 'NO' ELSE 'YES' END AS IsOverlapping   
 FROM #MyRanges m
LEFT OUTER JOIN #dbtable t
ON t.typeId = m.typeId
AND 
(t.tbl1_NumberFrom BETWEEN m.myr_NumberFrom AND m.myr_NumberTo
OR
t.tbl1_NumberTo BETWEEN m.myr_NumberFrom AND m.myr_NumberTo)
在t-sql中,有一种方法可以做到这一点:

SELECT  typeId, 
        myr_NumberFrom, 
        myr_NumberTo,
        CASE WHEN EXISTS
        (
            SELECT 1
            FROM #dbtable t
            WHERE t.typeId = m.typeId
            AND tbl1_NumberFrom <= myr_NumberTo
            AND tbl1_NumberTo >= myr_NumberFrom
        ) THEN 'Yes'
        ELSE 'No'
        END As IsOverlapping   
FROM #MyRanges m
已更改为左联接而不是子查询:

SELECT  m.typeId, 
        myr_NumberFrom, 
        myr_NumberTo,
        CASE WHEN t.typeId IS NOT NULL THEN 
            'Yes'
        ELSE
            'No'
        END As IsOverlapping   
FROM #MyRanges m
LEFT JOIN #dbtable t ON m.typeId = t.typeId
                    AND myr_NumberFrom <= tbl1_NumberTo
                    AND myr_NumberTo >= tbl1_NumberFrom
结果是一样的,现场演示已经更新


检查两个范围是否重叠的方法是测试一个范围是否在另一端之前开始,而另一个范围是否在第一个端点之前开始。 在t-sql中,有一种方法可以做到这一点:

SELECT  typeId, 
        myr_NumberFrom, 
        myr_NumberTo,
        CASE WHEN EXISTS
        (
            SELECT 1
            FROM #dbtable t
            WHERE t.typeId = m.typeId
            AND tbl1_NumberFrom <= myr_NumberTo
            AND tbl1_NumberTo >= myr_NumberFrom
        ) THEN 'Yes'
        ELSE 'No'
        END As IsOverlapping   
FROM #MyRanges m
已更改为左联接而不是子查询:

SELECT  m.typeId, 
        myr_NumberFrom, 
        myr_NumberTo,
        CASE WHEN t.typeId IS NOT NULL THEN 
            'Yes'
        ELSE
            'No'
        END As IsOverlapping   
FROM #MyRanges m
LEFT JOIN #dbtable t ON m.typeId = t.typeId
                    AND myr_NumberFrom <= tbl1_NumberTo
                    AND myr_NumberTo >= tbl1_NumberFrom
结果是一样的,现场演示已经更新


我的答案和你另一个问题的答案几乎相同

有四种类型的重叠。需要两个条件才能找到重叠。其他答案是忘记了重叠类型,其中myr_numberfromtbl1_numberto

Select distinct m.typeId, m.Myr_NumberFrom,m.Myr_NumberTo, 
        case when t.tbl1_NumberFrom is null then 'No' else 'yes' end isOverlapping
from #MyRanges m
left join #dbtable t on m.typeId = t.typeId
                and (m.Myr_NumberFrom between t.tbl1_NumberFrom and t.tbl1_NumberTo
                or  t.tbl1_NumberFrom between m.Myr_NumberFrom and m.Myr_Numberto)

我的答案和你另一个问题的答案几乎相同

有四种类型的重叠。需要两个条件才能找到重叠。其他答案是忘记了重叠类型,其中myr_numberfromtbl1_numberto

Select distinct m.typeId, m.Myr_NumberFrom,m.Myr_NumberTo, 
        case when t.tbl1_NumberFrom is null then 'No' else 'yes' end isOverlapping
from #MyRanges m
left join #dbtable t on m.typeId = t.typeId
                and (m.Myr_NumberFrom between t.tbl1_NumberFrom and t.tbl1_NumberTo
                or  t.tbl1_NumberFrom between m.Myr_NumberFrom and m.Myr_Numberto)

最后一排2-10-10不是应该是“是”吗?它与2-9-10重叠。@NemanjaPerovic哦,是的,你是对的。。修改了问题,谢谢!!!最后一排2-10-10不是应该是“是”吗?它与2-9-10重叠。@NemanjaPerovic哦,是的,你是对的。。修改了问题,谢谢!!!这不是很慢吗?使用“在案例中选择”时,子查询的速度可能比连接慢。如果你想转换成一个连接很容易…现在你还有一个左连接。不是很慢吗?使用“在案例中选择”时,子查询的速度可能比连接慢。如果你想转换成一个连接很容易…现在你还有一个左连接。