SQL查询:获取表中符合特定条件的所有起止路段对
解决SQL查询起止路段对的问题
要获取所有符合条件的起止路段对,核心是正确使用自连接并设置精准的过滤条件。以下分两种常见场景给出解决方案:
场景1:所有符合条件的起止对(不要求路段衔接)
如果不需要路段之间有物理衔接(即起始路段的终点和终止路段的起点无需匹配),直接用交叉连接结合WHERE过滤即可:
SELECT start_seg.SegmentID AS 起始路段ID, end_seg.SegmentID AS 终止路段ID, start_seg.StartPointType, end_seg.EndPointType FROM RoadSegments start_seg CROSS JOIN RoadSegments end_seg WHERE -- 起始路段的StartPointType为L或D start_seg.StartPointType IN ('L', 'D') -- 终止路段的EndPointType不为L或D AND end_seg.EndPointType NOT IN ('L', 'D');
场景2:需要路段衔接的起止对(起始路段终点=终止路段起点)
这是更贴合实际业务的场景,需要通过端点匹配来关联符合条件的路段:
SELECT start_seg.SegmentID AS 起始路段ID, end_seg.SegmentID AS 终止路段ID, start_seg.EndPoint AS 衔接端点, end_seg.EndPoint AS 最终终点 FROM RoadSegments start_seg INNER JOIN RoadSegments end_seg -- 关联条件:起始路段的终点是终止路段的起点 ON start_seg.EndPoint = end_seg.StartPoint WHERE start_seg.StartPointType IN ('L', 'D') AND end_seg.EndPointType NOT IN ('L', 'D');
排查你之前仅找到第一组的原因
大概率是以下问题导致:
- 连接条件错误:比如硬编码了某个特定路段ID的关联,而非通用的端点匹配逻辑
- WHERE条件遗漏或错误:比如未正确过滤
EndPointType NOT IN ('L', 'D'),或者字段值大小写与查询不匹配(比如实际值是小写l/d,但查询写了大写) - 未处理NULL值:如果
EndPointType存在NULL,NOT IN ('L','D')会自动排除NULL行,若需要包含NULL,需修改条件为:AND (end_seg.EndPointType NOT IN ('L', 'D') OR end_seg.EndPointType IS NULL)
内容的提问来源于stack exchange,提问作者mermosh
相关产品推荐
相关产品推荐

