2009-02-17 51 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 

(替换 '节点' 你的子查询)