我有一个 SQL 服务器表,其中每一行代表图形网络中的一条边。FromNodeID 和 ToNodeID 是节点表的外键,架构如下所示:
CREATE TABLE #Edges (
EdgeID int identity (1,1),
FromNodeID int,
ToNodeID int
);
INSERT INTO #Edges (FromNodeID, ToNodeID) VALUES
(1,2),
(1,3),
(1,4),
(2,3),
(3,5),
(4,5),
(5,6);
现在,如果我认为每条边都是有向的(即单向),那么很容易计算出我可以从任何节点直接到达的所有节点。我会在 FromNodeID 列中添加一个索引,然后运行如下查询:
SELECT ToNodeID FROM #Edges WHERE FromNodeID = 3
结果:5
但是,如果我想将每条边视为单向的,那么构建我的表/查询的最佳方式是什么。即从节点3开始,我想得到结果:
结果:1、2、5
我能想到的最简单的方法是向 ToNodeID 列添加一个附加索引,然后运行如下查询:
SELECT ToNodeID FROM #Edges WHERE FromNodeID = 3
UNION SELECT FromNodeID FROM #Edges WHERE ToNodeID = 3;
但这显然涉及组合来自两个查询的结果集,并且看起来效率不高 - 有没有更好的方法可以在单个查询中编写它?(请注意,我不想将反向边缘再次插入表中 - 我需要能够在运行时将边缘视为有向或无向)。
感谢您的任何建议!