各行がグラフネットワークのエッジを表す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;
しかし、これには明らかに2つのクエリの結果セットを組み合わせることが含まれ、あまり効率的ではないようです。これを1つのクエリで記述するためのより良い方法はありますか?(反転したエッジをテーブルに再度挿入したくないことに注意してください。実行時にエッジを有向または無向として扱うことができる必要があります)。
アドバイスありがとうございます!