Sql 如何根据范围类型确定重叠数范围?
我有两个表Table1记录列表和Table2我要检查的编号范围 考虑到TypeId,如何识别表2中的重叠范围/行 客观的 此外, 用于上述表的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
非常感谢 检查两个范围是否重叠的方法是测试一个范围是否在另一端之前开始,而另一个范围是否在第一个端点之前开始。
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_numberfrom
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_numberfrom
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哦,是的,你是对的。。修改了问题,谢谢!!!这不是很慢吗?使用“在案例中选择”时,子查询的速度可能比连接慢。如果你想转换成一个连接很容易…现在你还有一个左连接。不是很慢吗?使用“在案例中选择”时,子查询的速度可能比连接慢。如果你想转换成一个连接很容易…现在你还有一个左连接。