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