2009-02-17 21 views
1

雙向連接我有以下SQL結果集(作爲加入FWIW的結果):查找表中的

A,C 
B,E 
C,A 
D,A 

每個值代表一個節點。所以涉及的節點總數是A,B,C,D,E。每行描述一個有向邊。

A -> C 
B -> E 
C -> A 
D -> A 

當然,這可以簡化爲

A <-> C 
B -> E 
D -> A 

現在我想篩選出不具有雙向對應的行。所以,最終的結果集應該是

A,C 
C,A 

A,C 
在這種情況下

我正在尋找在SQL中表達這一點的最佳方式。

回答

1

想象一下,一個表中有節點Node1和Node2。

SELECT node1, node2 
FROM nodes n 
WHERE EXISTS (SELECT 1 FROM nodes WHERE node1 = n.node2 AND node2 = n.node1) 

當然,你要確保其適當的索引,即:

(node1, node2) 

(node2, node1) 

這仍然會得到你A,C和C,A。要過濾掉這些查詢,請將查詢更改爲:

SELECT node1, node2 
FROM nodes n 
WHERE EXISTS (SELECT 1 FROM nodes WHERE node1 = n.node2 AND node2 = n.node1) 
AND node1 < node2 

假設您可以利用自然排序。

+0

'節點' 實際上是一個選擇。因此,這似乎工作: 選擇節點1,從 (選擇...)N 其中存在的節點2(從 (選擇...)× 其中節點1 = n.node2和節點2 = n.node1選擇1 ) 但我想知道數據庫優化器是否真的足夠聰明,可以像這樣高效地執行它。 – tcurdt 2009-02-17 02:38:31

0
 

-- Temp table creating to insert example rows 
SELECT 
'A' AS Col1, 'C' AS Col2 
INTO #TEMP 
UNION 
SELECT 'B', 'E' 
UNION 
SELECT 'C', 'A' 
UNION 
SELECT 'D', 'A' 


SELECT A.* FROM #TEMP A, #TEMP B 
WHERE (A.COL1 = B.COL2 AND A.COL2 = B.COL1) 

 
0

內部加入節點對自己?

select node1, node2 
from nodes n 
inner join nodes n2 
on n.node1 = n2.node2 and n.node2 = n2.node1 

(替換 '節點' 你的子查詢)