我有一個SQL服務器表,其中每一行代表圖形網絡中的一條邊。該FromNodeID和ToNodeID外鍵的一個節點表,並且架構是這樣的:高效查詢SQL Server中有向/無向圖表邊緣表
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;
但是這顯然涉及到合併的結果集兩個查詢似乎並沒有非常有效的 - 有沒有更好的方式在單個查詢寫? (請注意,我不想再將反轉的邊緣插入表格中 - 我需要能夠在運行時將邊緣視爲定向或無定向)。
感謝您的任何建議!
如果`#邊緣`從FromNodeID = ToNodeID的情況下得到保護,則您的UNION版本將使用`UNION ALL`而不是`UNION`獲勝。即使允許使用自引用節點,您最好使用`SELECT ... WHERE FromNodeID = 3 AND ToNodeID <> 3 UNION ALL SELECT ... WHERE FromNodeID <> 3 AND ToNodeID = 3 UNION ALL SELECT 3 FROM #Edges WHERE FromNodeID = 3 AND ToNodeID = 3`,但前提是您不需要對節點進行排序(否則它的性能會比您的版本差)。 – 2011-01-27 09:27:53