在表格中找到双向连接

时间:2009-02-17 02:06:58

标签: sql

我有以下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中表达这一点的最佳方式。

3 个答案:

答案 0 :(得分: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

假设有自然顺序,你可以利用。

答案 1 :(得分: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)


答案 2 :(得分:0)

将节点对连接到自己?

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

(用你的子查询替换'nodes')